1. 程式人生 > >萬用字元匹配-LintCode

萬用字元匹配-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 可能為空,且只包含