某书2018面试题之最长对称子串

一、题目
  输入一个字符串,输出该字符串中对称的子字符串的最大长度。比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出 4。
二、思路

  遍历原字符串的所有子串,然后判断每个子串是否对称;该方法的时间复杂度:O(n3); 

三、代码

方法一的代码:

package redbook;

import java.util.ArrayList;
import java.util.Scanner;

/**
 * 我们让一个指针i从头至尾遍历,我们用另一个指针j从j=i+1逐一指向i后面的所有字符。就实现了原串的所有子串的遍历(子串为指针i到j中间的部分),最后判断得到的子串是否对称即可。
 */
public class Main4 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        //存储所有子串
        ArrayList<String> arrayList = new ArrayList<>();

        while (in.hasNext()) {
            //输入字符串
            String str = in.nextLine();
            //获取所有的子串
            StringBuffer sb = new StringBuffer();
            sb.append(str);
            for (int j = 0; j < sb.length(); j++) {
                for (int i = j; i < sb.length() + 1; i++) {
                    arrayList.add(sb.substring(j, i));
                }
            }
            //判断子串是否对称,如果对称获取其长度,然后返回最大的长度
           int theMaxLength=theMaxLength(arrayList);
            System.out.println(theMaxLength);
        }
    }

    public static int theMaxLength(ArrayList<String> arrayList) {
        int maxLength = 0;
        StringBuffer sb2 = new StringBuffer();

        for (int i = 0; i < arrayList.size(); i++) {
            String strTemp1 = arrayList.get(i);
           System.out.println(strTemp1);
            //字符串逆序
            String strTemp2 = sb2.append(strTemp1).reverse().toString();
            //将 sb2对象重新附值
            sb2=new StringBuffer();
            //获取对称子字符串的最大长度
            if(strTemp1.equals(strTemp2) && strTemp1.length()>maxLength){
                maxLength=strTemp1.length();
            }
        }
        return maxLength;
    }
}
View Code

---------------------------------------------

参考链接:

http://www.cnblogs.com/mickole/articles/3578298.html

posted @ 2017-10-25 16:25  AI菌  阅读(378)  评论(0编辑  收藏  举报