我有一个家庭作业,要求我们使用动态编程来计算给定字符串中可能的回文子串的数量。从理论上讲,我的程序应该可以运行,但是当我运行它时,运行每次都会失败。我没有得到任何编译器错误。这是我的代码:
#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
/*
*
*/
/*bool isPalindrome(string input){
bool isPal = true;
int j = (input.length() - 1);
for(int i = 0; i < (input.length()/2); i++){
if(input[i] != input[j]){
isPal = false;
}
j--;
}
return isPal;
}*/
bool isPalindrome(string input, bool array[5000][5000], int i, int j) {
int a = i;
int b = j;
if(array[i][j])
return true;
while(input[a] == input[b]){
array[a][b] = true;
a++;
b--;
if((b - a) <= 2){
break;
}
}
return array[i][j];
}
int numPalindrome(string input) {
bool array[5000][5000];
for(int k = 0; k < 5000; k++)
for(int n = 0; n < 5000; n++)
array[k][n] = false;
int count = 0;
for(int i = 0; i < input.length(); i++){
for(int j = i; j <= input.length(); j++){
if(isPalindrome(input, array, i, j)){
count++;
}
}
}
return count;
}
int main(int argc, char** argv) {
int count = numPalindrome("xabcba");
cout << "Count: " << count << endl;
return 0;
}
任何人都可以帮忙找出我的代码无法运行的原因吗?感谢。
答案 0 :(得分:1)
字符串中的所有回文都可以表示为这样的图形:
len
4 abba
/ | \
3 aba / | \ aca
/ | \ / | \ / | \
2 / | \ / bb \ / | \ aa
/ | \ / / \ \ / | \ / \
1 a b a b b a c a a
这种关系可以很容易地找到所有回文并将空间复杂度降低到O(n)
。由于我们只需要搜索长度为2和3的所有回文,因此减少了运行时间的复杂性。因此,除非输入是最坏的(&#34; aaaaaa ... aaaaaa&#34;例如。),我们可以大量减少搜索单词的数量。基本思想是简单地将回文物的位置存储在均匀或不平坦的位置,并搜索两个字符更长的回文。给出长度为n
的回文位置列表,我们可以通过检查左侧和右侧上一个回文旁边的字符是否相等来搜索长度为n + 2
的回文。