C++ 正则表达式匹配的时间复杂度
我正在解决leetcode上正则表达式匹配的问题。我使用递归解决了它,如下所示:C++ 正则表达式匹配的时间复杂度,c++,algorithm,time-complexity,C++,Algorithm,Time Complexity,我正在解决leetcode上正则表达式匹配的问题。我使用递归解决了它,如下所示: if (p.empty()) return s.empty(); if ('*' == p[1]) // x* matches empty string or at least one character: x* -> xx* // *s is to ensure s is non-empty return (isMatch(s,
if (p.empty()) return s.empty();
if ('*' == p[1])
// x* matches empty string or at least one character: x* -> xx*
// *s is to ensure s is non-empty
return (isMatch(s, p.substr(2)) || !s.empty() && (s[0] == p[0] || '.' == p[0]) && isMatch(s.substr(1), p));
else
return !s.empty() && (s[0] == p[0] || '.' == p[0]) && isMatch(s.substr(1), p.substr(1));
但是在这里,我怎样才能找到代码的时间复杂性呢
问题链接:
PS:在解决方案中,他们解释了时间复杂度,但我无法理解。假设T(T,p)
是函数的时间复杂度isMatch(text,pattern)
其中T是text.length()
而p是pattern.length()/2
第一个T(x,0)=1
然后如果模式[1]='*'
,T(T,p)=T(T,p-1)+T(T-1,p)+O(T+p)
否则T(T,p)=T(T-1,p-0.5)+O(T+p)
显然,第一种情况更糟
思考T
的组合含义。
最初,球是您在坐标(t,p)
上的球,一步即可将其移动到(t-1,p)
或(t,p-1)
,成本t+p
。
球停在轴上。
然后T(T,p)
等于从(T,p)
开始将球移动到轴的每种有效方式的总成本
那我们就知道了
所以总的时间复杂度是O((t+p)2^(t+p/2))
顺便说一句,如果您使用类似于std::string\u view
的东西,而不是.substr()
,这样可以防止复制整个字符串,那么您的代码将运行得更快。假设T(T,p)
是函数的时间复杂度isMatch(text,pattern)
其中T是text.length(),p是pattern.length()/2
第一个T(x,0)=1
然后如果模式[1]='*'
,T(T,p)=T(T,p-1)+T(T-1,p)+O(T+p)
否则T(T,p)=T(T-1,p-0.5)+O(T+p)
显然,第一种情况更糟
思考T
的组合含义。
最初,球是您在坐标(t,p)
上的球,一步即可将其移动到(t-1,p)
或(t,p-1)
,成本t+p
。
球停在轴上。
然后T(T,p)
等于从(T,p)
开始将球移动到轴的每种有效方式的总成本
那我们就知道了
所以总的时间复杂度是O((t+p)2^(t+p/2))
顺便说一句,如果您使用类似于std::string\u view
的内容,而不是.substr()
,则代码将运行得更快,这会阻止复制整个字符串