📌  相关文章
📜  字符串匹配,其中一个字符串包含字符

📅  最后修改于: 2021-04-24 16:38:17             🧑  作者: Mango

给定两个字符串,其中第一个字符串可能包含字符和第二字符串是一个正常的字符串。编写一个函数,如果两个字符串匹配,则返回true。以下是第一个字符串允许字符。

* --> Matches with 0 or more instances of any character or set of characters.
? --> Matches with any one character.

例如,“ g * ks”匹配与“ geeks”匹配。字符串“ ge?ks *”与“ geeksforgeeks”匹配(在第一个字符串的末尾注意“ *”)。但是“ g * k”与“ gee”不匹配,因为第二个字符串不存在字符“ k”。

C++
// A C program to match wild card characters
#include 
#include 
  
// The main function that checks if two given strings
// match. The first string may contain wildcard characters
bool match(char *first, char * second)
{
    // If we reach at the end of both strings, we are done
    if (*first == '\0' && *second == '\0')
        return true;
  
    // Make sure that the characters after '*' are present
    // in second string. This function assumes that the first
    // string will not contain two consecutive '*'
    if (*first == '*' && *(first+1) != '\0' && *second == '\0')
        return false;
  
    // If the first string contains '?', or current characters
    // of both strings match
    if (*first == '?' || *first == *second)
        return match(first+1, second+1);
  
    // If there is *, then there are two possibilities
    // a) We consider current character of second string
    // b) We ignore current character of second string.
    if (*first == '*')
        return match(first+1, second) || match(first, second+1);
    return false;
}
  
// A function to run test cases
void test(char *first, char *second)
{  match(first, second)? puts("Yes"): puts("No"); }
  
// Driver program to test above functions
int main()
{
    test("g*ks", "geeks"); // Yes
    test("ge?ks*", "geeksforgeeks"); // Yes
    test("g*k", "gee");  // No because 'k' is not in second
    test("*pqrs", "pqrst"); // No because 't' is not in first
    test("abc*bcd", "abcdhghgbcd"); // Yes
    test("abc*c?d", "abcd"); // No because second must have 2
                             // instances of 'c'
    test("*c*d", "abcd"); // Yes
    test("*?c*d", "abcd"); // Yes
    return 0;
}


Java
// Java program to match wild card characters 
class GFG 
{
  
// The main function that checks if 
// two given strings match. The first string 
// may contain wildcard characters
static boolean match(String first, String second) 
{
  
    // If we reach at the end of both strings, 
    // we are done
    if (first.length() == 0 && second.length() == 0)
        return true;
  
    // Make sure that the characters after '*' 
    // are present in second string. 
    // This function assumes that the first
    // string will not contain two consecutive '*'
    if (first.length() > 1 && first.charAt(0) == '*' && 
                              second.length() == 0)
        return false;
  
    // If the first string contains '?', 
    // or current characters of both strings match
    if ((first.length() > 1 && first.charAt(0) == '?') || 
        (first.length() != 0 && second.length() != 0 && 
         first.charAt(0) == second.charAt(0)))
        return match(first.substring(1), 
                     second.substring(1));
  
    // If there is *, then there are two possibilities
    // a) We consider current character of second string
    // b) We ignore current character of second string.
    if (first.length() > 0 && first.charAt(0) == '*')
        return match(first.substring(1), second) || 
               match(first, second.substring(1));
    return false;
}
  
// A function to run test cases
static void test(String first, String second)
{
    if (match(first, second))
        System.out.println("Yes");
    else
        System.out.println("No");
}
  
// Driver Code
public static void main(String[] args) 
{
    test("g*ks", "geeks"); // Yes
    test("ge?ks*", "geeksforgeeks"); // Yes
    test("g*k", "gee"); // No because 'k' is not in second
    test("*pqrs", "pqrst"); // No because 't' is not in first
    test("abc*bcd", "abcdhghgbcd"); // Yes
    test("abc*c?d", "abcd"); // No because second must have 2
                            // instances of 'c'
    test("*c*d", "abcd"); // Yes
    test("*?c*d", "abcd"); // Yes
}
}
  
// This code is contributed by
// sanjeev2552


Python
# Python program to match wild card characters
  
# The main function that checks if two given strings match.
# The first string may contain wildcard characters
def match(first, second):
  
    # If we reach at the end of both strings, we are done
    if len(first) == 0 and len(second) == 0:
        return True
  
    # Make sure that the characters after '*' are present
    # in second string. This function assumes that the first
    # string will not contain two consecutive '*'
    if len(first) > 1 and first[0] == '*' and  len(second) == 0:
        return False
  
    # If the first string contains '?', or current characters
    # of both strings match
    if (len(first) > 1 and first[0] == '?') or (len(first) != 0
        and len(second) !=0 and first[0] == second[0]):
        return match(first[1:],second[1:]);
  
    # If there is *, then there are two possibilities
    # a) We consider current character of second string
    # b) We ignore current character of second string.
    if len(first) !=0 and first[0] == '*':
        return match(first[1:],second) or match(first,second[1:])
  
    return False
  
# A function to run test cases
def test(first, second):
    if match(first, second):
        print "Yes"
    else:
        print "No"
  
# Driver program
test("g*ks", "geeks") # Yes
test("ge?ks*", "geeksforgeeks") # Yes
test("g*k", "gee") # No because 'k' is not in second
test("*pqrs", "pqrst") # No because 't' is not in first
test("abc*bcd", "abcdhghgbcd") # Yes
test("abc*c?d", "abcd") # No because second must have 2 instances of 'c'
test("*c*d", "abcd") # Yes
test("*?c*d", "abcd") # Yes
  
# This code is contributed by BHAVYA JAIN and ROHIT SIKKA


C#
// C# program to match wild card characters 
using System;
  
class GFG 
{
   
// The main function that checks if 
// two given strings match. The first string 
// may contain wildcard characters
static bool match(String first, String second) 
{
   
    // If we reach at the end of both strings, 
    // we are done
    if (first.Length == 0 && second.Length == 0)
        return true;
   
    // Make sure that the characters after '*' 
    // are present in second string. 
    // This function assumes that the first
    // string will not contain two consecutive '*'
    if (first.Length > 1 && first[0] == '*' && 
                              second.Length == 0)
        return false;
   
    // If the first string contains '?', 
    // or current characters of both strings match
    if ((first.Length > 1 && first[0] == '?') || 
        (first.Length != 0 && second.Length != 0 && 
         first[0] == second[0]))
        return match(first.Substring(1), 
                     second.Substring(1));
   
    // If there is *, then there are two possibilities
    // a) We consider current character of second string
    // b) We ignore current character of second string.
    if (first.Length > 0 && first[0] == '*')
        return match(first.Substring(1), second) || 
               match(first, second.Substring(1));
    return false;
}
   
// A function to run test cases
static void test(String first, String second)
{
    if (match(first, second))
        Console.WriteLine("Yes");
    else
        Console.WriteLine("No");
}
   
// Driver Code
public static void Main(String[] args) 
{
    test("g*ks", "geeks"); // Yes
    test("ge?ks*", "geeksforgeeks"); // Yes
    test("g*k", "gee"); // No because 'k' is not in second
    test("*pqrs", "pqrst"); // No because 't' is not in first
    test("abc*bcd", "abcdhghgbcd"); // Yes
    test("abc*c?d", "abcd"); // No because second must have 2
                            // instances of 'c'
    test("*c*d", "abcd"); // Yes
    test("*?c*d", "abcd"); // Yes
}
}
  
// This code is contributed by Rajput-Ji


输出:

Yes
Yes
No
No
Yes
No
Yes
Yes

锻炼
1)在上述方案中,第一字符串的所有非野生字符必须是有第二字符串和第二字符串的所有字符必须以一个正常的字符或第一字符串的字符匹配。扩展上述解决方案,使其像其他模式搜索解决方案一样工作,其中第一个字符串是模式,第二个字符串是文本,我们应该在第二个中打印所有出现的第一个字符串。

2)编写模式搜索函数,其中“?”的含义相同,但是’*’表示在’*’之前出现0次或多次的字符。例如,如果第一个字符串为“ a * b”,则它与“ aaab”匹配,但与“ abb”不匹配。