本文概述
- C ++
- Java
- python
- C#
* -->
Matches with 0 or more instances of any character or set of characters.
? -->
Matches with any one character.
例如, ” g * ks” 匹配与” geeks” 匹配。字符串” ge?ks *” 与” srcmini” 匹配(在第一个字符串的末尾注明” *” )。但是” g * k” 与” gee” 不匹配, 因为第二个字符串中没有字符” k” 。
C ++
// A C program to match wild card characters
#include <
stdio.h>
#include <
stdbool.h>
// 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*" , "srcmini" );
// 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*" , "srcmini" );
// 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 ] = = '*' andlen (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*" , "srcmini" ) # 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*" , "srcmini" );
// 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” 不匹配。
本文作者:维沙尔乔杜里并由srcmini小组审查。如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请写评论。
推荐阅读
- 算法设计(如何实现通配符模式匹配())
- Windows/Linux中所有已连接网络的Wi-Fi密码
- 算法设计(求二叉树的垂直宽度|S1)
- 为什么strcpy和strncpy使用不安全()
- 为什么快速排序首选用于数组,而合并排序首选用于链表()
- 桌豪OSD系统部署--上卷
- #yyds干货盘点# springcloud整合stream实现同一通道根据消息内容分发不同的消费逻辑
- 视频课程上线(AD账户清理_AD域日常维护实战)
- SpringSecurity能否吊打Shiro()