某书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; } }
---------------------------------------------
参考链接:
http://www.cnblogs.com/mickole/articles/3578298.html