例如,以下字符串是回文字符串:
aza
abba
abacaba
这些字符串不是回文:
zaza
abcd
abacada
给定长度为N的字符串S,字符串S的一个切片是由一对整数(p, q)指定的S子串,其中0 ≤ p < q < N
。如果由字母S[p], S[p+1], ..., S[q]
组成的字符串是回文的,则字符串S的切片(p, q)是回文的。
例如,在字符串S = abbacada
中:
切片(0, 3)是回文的,因为abba
是回文的,
切片(6, 7)不是回文的,因为da
不是回文的,
切片(2, 5)不是回文的,因为baca
不是回文的,
切片(1, 2)是回文的,因为bb
是回文的。
编写函数int solution(const string &S)
,给定长度为N的字符串S,返回字符串S的回文切片数。如果此数字大于100,000,000,则函数应返回-1。
例如,对于字符串S = baababa
,函数应该返回6,因为它的六个切片都是回文的:即(0, 3), (1, 2), (2, 4), (2, 6), (3, 5), (4, 6)
。
假设:
- N是在范围[0..20,000]内的整数;
- 字符串S仅由小写字母(a-z)组成。
复杂度:
- 预期的最坏时间复杂度为O(N);
- 预期的最坏空间复杂度为O(N)(不包括所需的输入参数存储)。
以下是我的解决方案:
int palindrom(const string &S, int startIndex,int endIndex, int counter=0)
{
bool equals = true;
if (endIndex - startIndex < 1)
return counter;
for(int i = startIndex,j = endIndex;i<j; ++i, --j)
{
equals = S[i] == S[j];
if (!equals) break;
}
if (equals) counter++;
counter = palindrom( S,startIndex,endIndex-1,counter);
return counter;
}
int solution(const string &S)
{
int length = S.size();
int counter = 0;
if (length > 20000) return -1;
for(int i=0; i < length-1; i++)
{
counter += palindrom(S,i,length-1);
if (counter > 100000000) return -1;
}
return counter;
}
对于字符串长度 S.size() > 3000,我总是会遇到运行时错误(意味着时间超过了 3 秒,但解决方案应该在少于 2 秒的时间内工作)!有什么建议吗?
好的!主函数大致如下:
main(){cout<<solution("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa");}
main()
和你的输入文本吗? - cdmh