• Leetcode:5. Longest Palindromic Substring


    一开始题目没读懂,下面是求首末是同一个字符的最长子字符串

    import java.util.HashMap;
    import java.util.HashSet;
    import java.util.Map;
    import java.util.Set;
    /*
     * 求首末是同一个字符的最长子字符串
     * */
    public class Sum22 {
        public String longestPalindrome(String s) {
            String string="";
            int max= 0;
            for (int i = 0; i < s.length(); i++) {
                char a = s.charAt(i);
                for (int j = s.length()-1; j >= 0; j--) {
                    char b= s.charAt(j);
                    if(a==b){
                        string = j-i+1>string.length()?s.substring(i,j+1):string;
                    }
                }
            }
            return string;
        }
        public static void main(String[] args) {
            String string = "abcdf";
            System.out.println(string.substring(0,2));
        }
    
    }

    看到是求解最长回文串,也蒙逼了,不会写,这里参考的是:http://blog.csdn.net/linhuanmars/article/details/20888595

     

    public class Sum22 {
        public String longestPalindrome(String s) {
            int len = 0;
            String result = "";
            for (int i = 0; i < 2*s.length()-1; i++) {
                int left = i/2;                       
                int right = i/2;
                if(i%2==1){
                    right++;
                }
                String string = getSubString(s, right, left);
                if(len<string.length()){
                    len = string.length();
                    result = string;
                }
            }
            return result;
        }
        
        public  String  getSubString(String s,int right,int left){
            while(left>=0&&right<s.length()&&s.charAt(right)==s.charAt(left)){  //left,right同时移动,并且在两个字符相同的情况下移动
                left--;     
                right++;
            }            //while结束后,left比实际要的字符串最右侧位置小1,right要大1
            return s.substring(left+1,right);  //substring()是从start位置开始,end-1位置结束,注意不包括end
        }
        public static void main(String[] args) {
        
        }
    
    }

    第二种方法是动态规划,没看太懂   http://blog.csdn.net/linhuanmars/article/details/20888595  http://blog.csdn.net/hopeztm/article/details/7932245

    这里动态规划的思路是 dp[i][j] 表示的是 从i 到 j 的字串,是否是回文串。

    则根据回文的规则我们可以知道:

    如果s[i] == s[j] 那么是否是回文决定于 dp[i+1][ j - 1]

    当 s[i] != s[j] 的时候, dp[i][j] 直接就是 false。

    import sun.net.www.content.text.plain;
    
    
    public class Sum22 {
        public String longestPalindrome(String s) {
            boolean[][] palin = new boolean[s.length()][s.length()];
            if(s.length()==0||s==null){
                return "";
            }
            String res = "";
            int len = 0;
            for (int i = s.length()-1; i >=0; i--) {
                for (int j = i; j < s.length(); j++) {
    //                if(s.charAt(i)==s.charAt(j)&&(j-i<=2||palin[i+1][j-1]==true)){  / //这里j-i<=2的意思是i,j中间只有一个字符,palin[i+1][j-1]是靠里面的子字符串
                        palin[i][j] = true;
                        if(j-i+1>len){
                            res = s.substring(i,j+1);
                            len = j-i+1;
                        }    
                    }
                }
            }
            return res;
        }
        
        
        public static void main(String[] args) {
            boolean[][] palin = new boolean[2][2];
            
            System.out.println(palin[0][0]);
        }
    
    }

  • 相关阅读:
    CSwinform程序分页
    C#跨线程访问控件
    CS程序发布版本后提示自动升级功能
    winform控件的二次开发
    JavaNetty拆包粘包(二)
    JavaNetty(一)
    JavaAIO编程
    javaNIO编程
    Java中bio编程
    如何使用CryptoJS配合Java进行AES加密和解密
  • 原文地址:https://www.cnblogs.com/Michael2397/p/8036163.html
Copyright © 2020-2023  润新知