萬用字元匹配-LintCode
判斷兩個可能包含萬用字元“?”和“*”的字串是否匹配。匹配規則如下:
'?' 可以匹配任何單個字元。
'*' 可以匹配任意字串(包括空字串)。
兩個串完全匹配才算匹配成功。
函式介面如下:
bool isMatch(const char *s, const char *p)
樣例
一些例子:
isMatch("aa","a") → false
isMatch("aa","aa") → true
isMatch("aaa","aa") → false
isMatch("aa", "*") → true
isMatch("aa", "a*") → true
isMatch("ab" , "?*") → true
isMatch("aab", "c*a*b") → false
思路:
利用回溯法,建構函式判斷在當前位置s和p是否匹配。給定位置m,n,
若p[n]是字母,若s[m]==p[n],處理m+1和n+1位置,否則返回false;
若p[n]=’?’,可以匹配任一單個字元,直接處理m+1和n+1位置;
若p[n]=’*’,匹配0個或多個字元,處理j和n+1位置(m<=j<=s.size()),
有滿則條件的情況則返回true,否則返回false。
為了減少計算量,將對於m,n位置的處理結果存入到map中。
#ifndef C192_H
#define C192_H
#include<iostream>
#include<string>
#include<map>
using namespace std;
class Solution {
public:
/*
* @param s: A string
* @param p: A string includes "?" and "*"
* @return: is Match?
*/
bool isMatch(string &s, string &p) {
// write your code here
map<pair<int, int>, bool> map;//利用map存放計算過的資料,減少運算量
return helper(s, p, 0, 0,map);
}
bool helper(string &s, string &p, int m, int n,map<pair<int,int>,bool> &map)
{
pair<int, int> pairVal = make_pair(m, n);
if (map.find(pairVal) != map.end())
return map[pairVal];
if (m >= s.size() && n == p.size())//設定終止條件
return true;
else if (m < s.size() && n < p.size())
{
if (isalpha(p[n])) //p中元素為字母的情況,直接判斷與s[m]是否相等
{
if (p[n] == s[m])
return helper(s, p, m + 1, n + 1,map);
else
{
map[pairVal] = false;
return false;
}
}
else if (p[n] == '?') //p中元素為'?',可以匹配任一單個字元,直接處理下一位
return helper(s, p, m + 1, n + 1,map);
else //p中元素為'*',迴圈判斷是否存在滿足條件的情況
{
bool flag = false;
for (int i = m; i <= s.size(); ++i)
{
flag = flag || helper(s, p, i, n + 1,map);
}
map[pairVal] = flag;
return flag;
}
}
//此時p[n]只能為'*'
else if (m >= s.size() && n < p.size())
{
for (int j = n; j < p.size(); ++j)
{
if (p[j] != '*')
return false;
}
return true;
}
else
return false;
}
};
#endif
相關推薦
萬用字元匹配-LintCode
判斷兩個可能包含萬用字元“?”和“*”的字串是否匹配。匹配規則如下: '?' 可以匹配任何單個字元。 '*' 可以匹配任意字串(包括空字串)。 兩個串完全匹配才算匹配成功。 函式介面如下: b
LintCode (192)萬用字元匹配
題目 判斷兩個可能包含萬用字元“?”和“*”的字串是否匹配。匹配規則如下: '?' 可以匹配任何單個字元。 '*' 可以匹配任意字串(包括空字串)。 兩個串完全匹配才算匹配成功。 函式介面如下: bool isMatch(const char *s, const
Leetcode 44:萬用字元匹配(超詳細的解法!!!)
給定一個字串 (s) 和一個字元模式 (p) ,實現一個支援 '?' 和 '*' 的萬用字元匹配。 '?' 可以匹配任何單個字元。 '*' 可以匹配任意字串(包括空字串)。 兩個字串完全匹配才算匹配成功。 說明: s 可能為空,且只包含從 a-z 的小寫字母。
[Luogu P3167] [BZOJ 3507] [CQOI2014]萬用字元匹配
洛谷傳送門 BZOJ傳送門 題目描述 幾乎所有作業系統的命令列介面(CLI)中都支援檔名的萬用字元匹配以方便使用者。最常見的萬用字元有兩個,一個是星號(*),可以匹配 0
D-動態規劃比遞迴快-LeetCode44-萬用字元匹配
題目 給定一個字串 (s) 和一個字元模式 (p) ,實現一個支援 '?' 和 '*' 的萬用字元匹配。 '?' 可以匹配任何單個字元。 '*' 可以匹配任意字串(包括空字串)。 兩個字串完全匹配才算匹配成功。 說明: s 可能為空,且只包含從 a-z 的小寫字母。 p 可能為空,且只包含
萬用字元匹配
給定一個字串 (s) 和一個字元模式 § ,實現一個支援 ‘?’ 和 ‘*’ 的萬用字元匹配。 ‘?’ 可以匹配任何單個字元。 ‘*’ 可以匹配任意字串(包括空字串)。 兩個字串完全匹配才算匹配成功。 說明: s 可能為空,且只包含從 a-z 的小寫字母。 p 可能為空,且只包含
leetcode 44. 萬用字元匹配
給定一個字串 (s) 和一個字元模式 (p) ,實現一個支援 '?' 和 '*' 的萬用字元匹配。 '?' 可以匹配任何單個字元。 '*' 可以匹配任意字串(包括空字串)。 兩個字串完全匹配才算匹
【leetCode】44_萬用字元匹配
dp: class Solution { public: bool isMatch(string s, string p) { //tag 用於dp,tag[i][j]代表s的子串s[0,i-1] 可以匹配 p的子串p[0,j-1]。
【LeetCode】44. 萬用字元匹配
題目描述 思路(與10. 正則表示式匹配類似) dp[ i ][ j ] 表示 s 的前 i 個字元與 p 的前 j 個字元的匹配結果。 先寫邊界情況,再寫 dp 方程,若 p[ j - 1] 為 * ,dp[ i ][ j ] = dp[ i - 1][ j
leetcode 44 ---- 動態規劃(困難) :萬用字元匹配(java)
1. 問題:給定一個字串 (s) 和一個字元模式 (p) ,實現一個支援 '?' 和 '*' 的萬用字元匹配。 '?' 可以匹配任何單個字元。 '*' 可以匹配任意字串(包括空字串)。 兩個字串完全匹配才算匹配成功。 說明: s 可能為空,且只包含從 a-z 的小
萬用字元匹配_講解和python3實現
題目描述 給定一個字串 (s) 和一個字元模式 § ,實現一個支援 ‘?’ 和 ‘*’ 的萬用字元匹配。 ‘?’ 可以匹配任何單個字元。 ‘*’ 可以匹配任意字串(包括空字串)。 兩個字串完全匹配才算匹配成功。 說明: s 可能為空,且只包含從 a-z 的小寫字母。 p 可能
LeetCode 10 & 44 正則表示式匹配 & 萬用字元匹配 字串匹配問題
10 正則表示式匹配 給定一個字串 (s) 和一個字元模式 (p)。實現支援 ‘.’ 和 ‘*’ 的正則表示式匹配。 ‘.’ 匹配任意單個字元。 ‘*’ 匹配零個或多個前面的元素。 匹配應該覆蓋整個字串 (s) ,而不是部分字串。 說明: s 可能為
44. 萬用字元匹配
給定一個字串 (s) 和一個字元模式 (p) ,實現一個支援 '?' 和 '*' 的萬用字元匹配。 '?' 可以匹配任何單個字元。 '*' 可以匹配任意字串(包括空字串)。 兩個字串完全匹配才算匹配成功。 說明: s 可能為空,且只包含從 a-z 的小寫字母。 p
bzoj3507 [Cqoi2014]萬用字元匹配
我們將題目輸入的那個含萬用字元的串,記為“萬用字元串”,下面的檔名記為“檔名”,“檔名”數量很少可以依次查詢。 我們先將“萬用字元串”以‘*’為界,將“萬用字元串”分解,得到若干子串,記為“通配子串” 我們將每個“通配子串”各建立一個AC自動機。 而有的“通配子串”可能含
String、動態規劃——wildcard-matching 萬用字元匹配
Implement wildcard pattern matching with support for'?'and'*'. '?' Matches any single character. '*' Matches any sequence of characters
LeetCode-44.萬用字元匹配(考察點:動態規劃)
給定一個字串 (s) 和一個字元模式 (p) ,實現一個支援 '?' 和 '*' 的萬用字元匹配。 '?' 可以匹配任何單個字元。 '*' 可以匹配任意字串(包括空字串)。 兩個字串完全匹配才算匹配成功。 說明: s 可能為空,且只包含從 a-z 的小寫字母。 p
【每日面試題】字串萬用字元匹配問題
題目:在一篇英文文章中查詢指定的人名,人名使用二十六個英文字母(可以是大寫或小寫)、空格以及兩個萬用字元組成(*、?),萬用字元“*”表示零個或多個任意字母,萬用字元“?”表示一個任意字母。 如:“J* Smi??” 可以匹配“John Smith” . 請用C語言實現如下
Java 萬用字元匹配查詢檔案
============================= 字串匹配例子 String s = "*txt.*"; s = s.replace('.', '#'); s = s.replaceAll("#", "////."); s =
華為code中的字串萬用字元匹配
#define FALSE 0 #define TRUE 1 #define M 300 #include<stdio.h> #include<string.h> int equal(char *s, char *p) { char tem
python leetcode 044 萬用字元匹配(困難)解題報告
給定一個字串 (s) 和一個字元模式 (p) ,實現一個支援 '?' 和 '*' 的萬用字元匹配。'?' 可以匹配任何單個字元。 '*' 可以匹配任意字串(包括空字串)。 兩個字串完全匹配才算匹配成功。說明:s 可能為空,且只包含從 a-z 的小寫字母。p 可能為空,且只包含