写了一个爆搜,超时了,所以更改了一个方法,使用flag数组记录标志,
动态规划,类似于lcs的解法,数组flag[i][j]记录s从i到j是不是回文
首先初始化,i>=j时,flag[i][j]=true,这是因为s[i][i]是单字符的回文,当i>j时,为true,是因为有可能出现flag[2][1]这种情况,比如bcaa,当计算s从2到3的时候,s[2]==s[3],这时就要计算s[2+1] ?= s[3-1],总的来说,当i>j时置为true,就是为了考虑j=i+1这种情况。
接着比较s[i] = s[j],如果成立,那么flag[i][j] = flag[i+1][j-1],否则直接flag[i][j]=false
public class Solution { public String longestPalindrome(String s) { int n = s.length(); int max = 0,st = 0,end = 0; boolean [][]flag = new boolean[n][n]; for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) { if(i < j) flag[i][j] = false; else flag[i][j] = true; } } for(int i = 1; i < n;i++) { for(int j = 0; j < i; j++ ) { if(s.charAt(i) == s.charAt(j)) { flag[j][i] = flag[j+1][i-1]; if(flag[j][i] == true && i - j + 1 > max) { max = i-j+1; st = j; end = i; } } else flag[j][i] = false; } } return s.substring(st,end+1); } }
不知怎么的,leetcode上提交第一次的时候,又是显示超时,但是又提交了一次后,显示通过了。(meng)。
时间: 2024-10-10 16:34:22