最长回文子串(快手校招题目)

最长回文子串(快手校招题目)_第1张图片
1

最长回文子串(快手校招题目)_第2张图片
2

动态规划的解法

以adbca为例子

状态数组dp[i][j]表示从 i~j最大的回文串长度


最长回文子串(快手校招题目)_第3张图片
状态转移方程为

初始状态数组

a\d\b\c\a

1 2 3 4 5
1 1
2 0 1
3 0 0 1
4 0 0 0 1
5 0 0 0 0 1

第一次遍历 len = 2时 状态数组

ad\db\bc\ca

1 2 3 4 5
1 1 1
2 0 1 1
3 0 0 1 1
4 0 0 0 1 1
5 0 0 0 0 1

第三次遍历 len = 3

adb\dbc\bca

1 2 3 4 5
1 1 1 1
2 0 1 1 1
3 0 0 1 1 1
4 0 0 0 1 1
5 0 0 0 0 1

第四次遍历 len = 4

adbc\dbca

1 2 3 4 5
1 1 1 1 1
2 0 1 1 1 1
3 0 0 1 1 1
4 0 0 0 1 1
5 0 0 0 0 1

第五次遍历 len = 5

adbca

1 2 3 4 5
1 1 1 1 1 3
2 0 1 1 1 1
3 0 0 1 1 1
4 0 0 0 1 1
5 0 0 0 0 1

代码

    public static void main(String args[]){
        
        Scanner sc = new Scanner(System.in);
        char[] array = sc.next().toCharArray();

        //字符串长度
        int N = array.length;
        int[][] dp = new int[N][N];
        //状态数组
        for(int i = 0; i < N;dp[i][i] = 1,i++){}
        for(int len = 2; len <= N;len++ ){
            for(int i = 0; i + len <= N;i++){
                if(array[i] == array[i+len-1]){
                    dp[i][i+len-1] = dp[i+1][i+len-2]+2;
                }
                 dp[i][i+len-1] = Math.max(dp[i][i+len-1],Math.max(dp[i][i+len-2],dp[i+1][i+len-1]));
                
            }
        }
        
        System.out.println(dp[0][N-1]);

思考

该问题具有最优子结构问题,从i - j 的最长回文串等于 i+1~j-1的最长回文串+2 或 i+1~j 或 i~j-1的最长回文串
只要知道了状态转移的规律,就可以很容易写出代码

你可能感兴趣的:(最长回文子串(快手校招题目))