为什么我在这个函数中出现越界异常?
问题描述:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int findpali (string s,int dp[][100],int st, int e);
int main (void)
{
string s;
cin>>s;
int dp[100][100];
for (int i = 0; i < 100; i++)
for (int j = 0; j < 100; j++)
dp[i][j] = -1;
int out = findpali(s,dp,0,s.length()-1);
cout<<out<<"\n";
return 0;
}
int findpali (string s,int dp[][100],int st, int e) // st ->starting position, e -> ending position
{
if (s.length() == 1)
{
dp[st][e] = 1;
return 1;
}
else if (s.length()==2 && s[st] == s[e])
{
dp[st][e] = 2;
return 2;
}
else if (dp[st][e] != -1)
return dp[st][e];
else if (s[st] == s[e])
{
dp[st][e] = findpali(s.substr(st+1,s.length()-2),dp,st+1,e-1)+2;
return dp[st][e];
}
else
{
dp[st][e] = max(findpali(s.substr(st,s.length()-1),dp,st,e-1),findpali(s.substr(st+1,s.length()-1),dp,st+1,e));
return dp[st][e];
}
}
上面的函数查找给定字符串中最长回文的长度。我已经将给定的数组dp
初始化为-1
,然后我将不同的值存储在数组中。但是,当我输入一个像ABCD
这样的字符串时,它说出了异常并且中止。这可能是什么原因?谢谢!为什么我在这个函数中出现越界异常?
答
您需要在函数的开始处为空字符串添加测试。另外,您正在为原始string s
存储dp
,因此当您使用s的子串更新它时,结果不再有效。每次您递归调用函数时,您都可以通过不同的索引st and e
。
修改后的功能可能是这个样子:
int findpali(string &s, int dp[][100], int st, int e)
{
if(s.length()==0 || st > e) { //extra test for boundary case
return 0;
}
if(st==e) // length 1 substring
{
dp[st][e]=1;
return 1;
} else if(e-st==1 && s[st] == s[e]) // length 2 substring
{
dp[st][e]=2;
return 2;
} else if(dp[st][e] != -1)
return dp[st][e];
else if(s[st] == s[e])
{
dp[st][e]=findpali(s, dp, st+1, e-1)+2;
return dp[st][e];
} else
{
dp[st][e]=max(findpali(s, dp, st, e-1), findpali(s, dp, st+1, e));
return dp[st][e];
}
}
原因可能是您索引值过大的阵列。使用调试器找出在哪里。 – yizzlez
'我已经将给定的数组dp初始化为-1,然后我将不同的值存储在数组中.'没有人知道'st'和'e'的值是多少。我们甚至不知道'dp'的真正维度是什么。不用说,这个功能失败的方式有很多。 – PaulMcKenzie
也添加了'main'。 :) –