通配符匹配
实现通配符模式匹配,支持'?'和'*'。通配符匹配算法的时间复杂度是多少?
- '?'匹配任何单个字符。
- '*'匹配任何字符序列(包括空序列)。
匹配应该覆盖整个输入字符串(不是部分)。
函数原型应该是:
布尔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