美文网首页
腾讯2017暑期实习生编程题 第一题

腾讯2017暑期实习生编程题 第一题

作者: 就这些吗 | 来源:发表于2020-01-25 04:25 被阅读0次

    测试地址:https://www.nowcoder.com/questionTerminal/28c1dc06bc9b4afd957b01acdf046e69
    问题:给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
    输出需要删除的字符个数。

    image.png
    思路:将字符串倒置后与原来的字符串比较,得到最大子串就是回文了。这样就变成最长公共子序列(LCS)问题。动态规划模拟推导过程即可。可以参考下边的链接学习
    文本比较算法Ⅱ——Needleman/Wunsch算法
    import java.util.Scanner;
    public class Main{
    
        
    public static void main(String[] args) {
    
            Scanner sc=new Scanner(System.in);
            while (sc.hasNext()) {
            String s1 = sc.nextLine();
                String s2 = new StringBuffer(s1).reverse().toString();
            int dp[][]=new int [s1.length()+1][s2.length()+1];
            for(int i=1;i<s1.length()+1;i++) {
                for(int n=1;n<s2.length()+1;n++) {
                    if(s1.charAt(i-1)==s2.charAt(n-1)) {
                        dp[i][n]=dp[i-1][n-1]+1;
                    }else {
                        dp[i][n]=dp[i-1][n]>dp[i][n-1]?dp[i-1][n]:dp[i][n-1];
                    }
                }
            }
            System.out.println(s1.length()-dp[s1.length()][s2.length()]);
            
        }
            }
            
                
    }
    

    相关文章

      网友评论

          本文标题:腾讯2017暑期实习生编程题 第一题

          本文链接:https://www.haomeiwen.com/subject/vqfrthtx.html