题解 | #密码截取#
密码截取
http://www.nowcoder.com/practice/3cd4621963e8454594f00199f4536bb1
Java解法
基本思路
- 从i开始向两边扩展,判断最远可以向外延伸多少(奇偶的判定方法有些区别)
- 分最长子串是奇偶两种情况,最终每个i从两者中选出一个较大的
- 对所有i的最长子串进行排序,选出最长的
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.next();
int[] maxLength1 = new int[s.length()];
int[] maxLength2 = new int[s.length()];
//如果最长子串是奇数
for(int i=0;i<s.length();i++) {
maxLength1[i] = 1;
for(int j=0;j<Math.min(i-0, s.length()-i-1);j++) {
if(s.charAt(i-j-1) != s.charAt(i+j+1)) {
break;
}else {
maxLength1[i]++;
}
}
maxLength1[i] = maxLength1[i]*2-1;
}
//如果最长子串是偶数
for(int i=0;i<s.length();i++) {
maxLength2[i]=0;
for(int j=0;j<Math.min(i-0+1, s.length()-i-1);j++) {
if(s.charAt(i-j) != s.charAt(i+j+1)) {
break;
}else {
maxLength2[i]++;
}
}
maxLength2[i] = maxLength2[i]*2;
}
//奇偶中选一个大的
int[] maxLength = new int[s.length()];
for(int i=0;i<s.length();i++) {
maxLength[i] = Math.max(maxLength1[i], maxLength2[i]);
}
Arrays.sort(maxLength);
System.out.println(maxLength[s.length()-1]);
}
}