通配符匹配
實現通配符模式匹配,支持'?'和'*'。通配符匹配算法的時間複雜度是多少?
- '?'匹配任何單個字符。
- '*'匹配任何字符序列(包括空序列)。
匹配應該覆蓋整個輸入字符串(不是部分)。
函數原型應該是:
布爾isMatch(常量字符* S,常量字符* P)一些例子:
- isMatch( 「AA」,」 a「)→false
- isMatch(」aa「,」aa「)→true
- isMatch(」aaa「,」aa「)→false
- isMatch( 「AA」, 「*」)→真
- isMatch( 「AA」, 「A *」)→真
- isMatch( 「AB」, 「*?」)→真
- isMatch( 「AAB」, 「C * A * b」)→假
問題:
- 什麼是時間複雜度?
- 什麼是空間複雜性?
我個人認爲,
- 時間複雜度高度家屬對 「輸入」,不能寫 出像T = O(?)。
- 空間複雜度= O(min(sLen,pLen)),因爲最大遞歸 depth = 0(min(sLen,pLen))。
曾嘗試:
寫出時間複雜度表達,然後繪製遞歸樹:
TC Expression => T(n) = T(n - 1) + O(1), when pChar == '?' or pChar == sChar,
= T(n - 1) + T(n - 1) + O(1), when pChar == '*'.
我試着畫遞歸樹,但無法弄清楚如何在此基礎上把它畫時間複雜性表達。
其他問題:
準確,我希望知道如何計算的時間複雜度爲這種遞歸,它具有基於多輸入多不可預見的分支。
注:
- 我知道,這兩個迭代的解決方案和遞歸的解決方案,但不能 弄清楚如何計算時間複雜度爲 遞歸的解決方案。
- 這是不是作業,這個問題是從「leetcode.com」,我 只是希望知道如何計算 這種特殊遞歸的時間複雜性的方法。
代碼:的Java, 解決方案:遞歸。
public class Solution {
public boolean isMatch(String s, String p) {
// Input checking.
if (s == null || p == null) return false;
int sLen = s.length();
int pLen = p.length();
return helper(s, 0, sLen, p, 0, pLen);
}
private boolean helper(String s, int sIndex, int sLen,
String p, int pIndex, int pLen) {
// Base case.
if (sIndex >= sLen && pIndex >= pLen) return true;
else if (sIndex >= sLen) {
// Check whether the remaining part of p all "*".
while (pIndex < pLen) {
if (p.charAt(pIndex) != '*') return false;
pIndex ++;
}
return true;
} else if (pIndex >= pLen) {
return false;
}
char sc = s.charAt(sIndex);
char pc = p.charAt(pIndex);
if (pc == '?' || pc == sc) {
return helper(s, sIndex + 1, sLen, p, pIndex + 1, pLen);
} else if (pc == '*') {
return helper(s, sIndex, sLen, p, pIndex + 1, pLen) ||
helper(s, sIndex + 1, sLen, p, pIndex, pLen);
} else return false;
}
}
我認爲你的問題沒問題。儘管如此,我將編輯一些關於降薪的噪音;他們發生了,他們不一定需要解釋(特別是如果這個人不想給你一個)。 – Makoto 2014-09-04 19:20:44
你是對的,謝謝@Makoto – Zhaonan 2014-09-04 19:24:51
作爲一個說明 - 如果你使用遞歸和記憶(本質上,自上而下的DP),這應該是非常快的,因爲有這麼多重疊的子問題。 – templatetypedef 2014-09-04 21:56:24