java面试题回文文字_一次面试,回文字符串的实现

记一次面试:求一个字符串的最大回文子字符串

1.回文字符串的分类

1.1 单核回文 abcba

1.2 双核回文 abccba

2 解题方法

2.1 暴力求解

/**

* 暴力求解

* 1.遍历字符串,

* 2,判断其子字符串是否回文,这里的子字符串是依次减少的

* 3.如果回文,就结束循环,返回最长的回文字符串

* 时间复杂度On3(有点高)

*/

public static String longestPalindrome(String str){

if (str.length() <= 1) {

return str;

}

for (int i = str.length(); i > 0; i--) {

for (int j = 0; j

String sub = str.substring(j,i+j); // 得到子字符串

int count = 0;

// 判断是否回文

for (int k = 0; k

if(sub.charAt(k) == sub.charAt(sub.length()-k-1)){

count++;

}

}

if(count == sub.length()/2){

return sub;

}

}

}

return ""; // 没有找到最长的字符串

}

2.2 声明两个高低指针,找到回文字符串的核,然后向两边扩展

/**

1)将子串分为单核和双核的情况,单核即指子串长度为奇数,双核则为偶数;

2)遍历每个除最后一个位置的字符index(字符位置),单核:初始low = 初始high = index,low和high均不超过原字符串的下限和上限;判断low和high处的字符是否相等,相等则low++、high++(双核:初始high = 初始low+1 = index + 1);

3)每次low与high处的字符相等时,都将当前最长的回文子串长度与high-low+1比较。后者大时,将最长的回文子串改为low与high之间的;

4)重复执行2)、3),直至high-low+1 等于原字符串长度或者遍历到最后一个字符,取当前截取到的回文子串,该子串即为最长的回文子串。

*/

public static String longestPalindrome1(String str){

if(str.length() <= 1){

return str;

}

for (int i = 0; i < str.length()-1; i++) {

findLongPlaindrome(str,i,i); // 单核

findLongPlaindrome(str,i,i+1); // 双核

}

return sub;

}

/**

* 核心思想是声明两个指针,找到这个回文字符串的核,然后向两边外扩展

* @param str 目标字符串

* @param low 低指针

* @param high 高指针

*/

private static void findLongPlaindrome(String str, int low, int high) {

while(low >= 0 && high <= str.length()-1){

if(str.charAt(low) == str.charAt(high)){

if(high-low+1 > maxLength){

maxLength = high-low+1;

sub = str.substring(low, high + 1);

}

low--;

high++;

}else{

break;

}

}

}

3 测试

public static void main(String[] args) {

String test = "abcbadefg";

test = FindMaxLengthSubString.longestPalindrome(test);

//test = FindMaxLengthSubString.longestPalindrome1(test);

System.out.println(test);

}

结果

abcba

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值