4月3日腾讯笔试题“最长回文子串”PS

题目如上:

下面附上代码:

package leetcode;


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


public class LongestPalindromicSubString {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
    while (sc.hasNext()) {
String string = sc.next();
int maxLen = LongestPalindromicSubString.longestPalindrome(string);
System.out.println(maxLen);
}
}


@SuppressWarnings("unused")
public static int longestPalindrome(String s) {
/* zhuyuqing
1. 存放各回文子串的数组;
2. 存放各回文子串;
3. 前后开始遍历
4. 如果前后字符相等,将对应的索引放入数组aList2中
5. 处理遇到ada、aaa、asdsa这种类型的字符串
6. 遍历aList数组,找出里面最大的数组,它的大小即为最长回文子串的长度 
*/
int longest = 0;
int len = s.length();
if(len == 1){
return 1;
}
ArrayList<ArrayList<Integer>> aList = new ArrayList<>();//1
for (int i = 0; i < len; i++) {
ArrayList<Integer> aList2 = new ArrayList<>();//2
for (int j = len - 1; j > i; j--) {//3
if (s.charAt(i) == s.charAt(j)) {//4
aList2.add(i);
aList2.add(j);
i++;
j--;
if(i == j)//5
aList2.add(i);
j++;
continue;
}
}
if (aList2 != null) {
aList.add(aList2);
}
}
if(aList == null){
longest = 1;
}
for(ArrayList<Integer> arrayList : aList){//6
int asize;
if((asize = arrayList.size()) > longest)
longest = asize;
}
return longest;
}
}

时间紧迫,笔试的时候,一时也没能做出来,当时也不管做不做弊了,直接把题目截下来。解法有点暴力,仅供参考,如果有好的方法,希望各位大神不吝赐教。

PS:

上面代码考虑的还不够完善,可能误导了一些看客,以下是重新修改后的代码,试过很多情况,都是可以的,但也不能保证一定正确,如果大家有测试出来错的情况,请一定留言告知我,万分感谢!

package leetcode;


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


public class LongestPalindromicSubString {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
while (sc.hasNextLine()) {
String string = sc.nextLine();
int maxLen = LongestPalindromicSubString.longestPalindrome(string);
System.out.println(maxLen);
}
}
@SuppressWarnings("unused")
public static int longestPalindrome(String s) {
/*
* zhuyuqing 
* 1. 存放各回文子串的数组;
* 2. 存放各回文子串;
* 3. 前后开始遍历 
* 4.如果前后字符相等,将对应的索引放入数组aList2中
* 5. 处理遇到ada、aaa、asdsa这种类型的字符串 
* 6. 内部遍历完一次 
* 7.如果遍历到i的下一个值为j最左端的回文索引,则往数组加上该i值并结束这次内部循环 
* 8. j回到最左端的回文索引 
* 9.i回到进入内部循环前的值 
* 10.将一次内部循环的回文字符串索引的数组aList2放到aList中
* 11.遍历aList数组,找出里面最大的数组,它的大小即为最长回文子串的长度
*/
int longest = 0;
int len = s.length();
// int jFlag = 0;
if (len == 0) {
return 0;
}
if (len == 1) {
return 1;
}
ArrayList<ArrayList<Integer>> aList = new ArrayList<>();// 1
for (int i = 0; i < len; i++) {
int iFlag = i;
int jFlag = len - 1;
ArrayList<Integer> aList2 = new ArrayList<>();// 2
for (int j = len - 1; j > i; j--) {// 3
if (s.charAt(i) == s.charAt(j)) {// 4
jFlag = j;
aList2.add(i);
aList2.add(j);
i++;
j--;
if (i == j)// 5
aList2.add(i);
j++;
continue;
} else if ((i + 1) == j) {// 6
i++;
if ((i + 1) == jFlag) {// 7
aList2.add(i);
break;
}
j = jFlag;// 8
}
}
i = iFlag;// 9
if (aList2 != null) {
aList.add(aList2);// 10
}
}
if (aList == null) {
longest = 1;
}
for (ArrayList<Integer> arrayList : aList) {// 11
int asize;
if ((asize = arrayList.size()) > longest)
longest = asize;
}
return longest;
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值