为什么我在这个函数中出现越界异常?

问题描述:

#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这样的字符串时,它说出了异常并且中止。这可能是什么原因?谢谢!为什么我在这个函数中出现越界异常?

+2

原因可能是您索引值过大的阵列。使用调试器找出在哪里。 – yizzlez

+0

'我已经将给定的数组dp初始化为-1,然后我将不同的值存储在数组中.'没有人知道'st'和'e'的值是多少。我们甚至不知道'dp'的真正维度是什么。不用说,这个功能失败的方式有很多。 – PaulMcKenzie

+0

也添加了'main'。 :) –

您需要在函数的开始处为空字符串添加测试。另外,您正在为原始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]; 
    } 
}