java字符串回文算法(中心扩散法)

java代码:

public class date_7_2_回文字符串算法 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.print("pls enter the String: ");
        String str1 = input.nextLine();

        String result = str1.substring(0, 1);               // 防止出现字符串只有一个元素的情况
        for (int i = 0; i < str1.length(); i++) {
            result = extend_from_center(str1, i, i, result);
            result = extend_from_center(str1, i, i+1, result);
        }
        System.out.println(result);
    }

    public static String extend_from_center(String str, Integer left_index, Integer right_index, String result) {
        while (left_index >= 0 && right_index < str.length() && str.charAt(left_index) == str.charAt(right_index)) {
            left_index--;
            right_index++;
        }
        if (right_index - left_index - 1 > result.length()) {
            result = str.substring(left_index+1, right_index);
        }

        return result;
    }
    
}

详解例子:

假如给的string是“abba”(接下来我就尽量用下标位置说明,以免混淆)
首先初始化 result = s.substring(0,1)这里是拿到下标0的数据也就是a
for loop对字符串的长度遍历每次拿到index(0,1,2,3)

第一次loop:
本次loop第一次entendFromCenter传入(abba,0,0)进行while判断,首先left大于0,right小于abba的长度,str【0】 等于str【0】,进入while,left --,right ++,再次进行while判断,left小于0,终止
此时left是-1,right是1,进行if判断,right-left-1 = 1,不大于result 的长度,结束

本次loop第二次entendFromCenter传入(abba,0,1)进行while判断,首先left大于0,right小于abba的长度,str【0】不等于str【1】,此时left是0,right是1,进行if判断,right-left-1 = 0,不大于result 的长度,结束

第二次loop:
本次loop第一次entendFromCenter传入(abba,1,1)进行while判断,首先left大于0,right小于abba的长度,str【1】 等于str【1】,进入while,left --,right ++,再次进行while判断,str【0】不等于str【2】,终止
此时left是0,right是2,进行if判断,right-left-1 = 1,不大于result 的长度,结束

本次loop第二次entendFromCenter传入(abba,1,2)进行while判断,首先left大于0,right小于abba的长度,str【1】等于str【2】,进入while,left --,right ++,再次进行while判断,str【0】等于str【3】,进入while,left --,right ++,再次进行while判断,left小于0,结束。
此时left是-1,right是4,进行if判断,right-left-1 = 4,大于result 的长度,将result 替换为str.substring(0, 3), 也就是result =“abba”,结束

第三次loop,第四次loop……
后面就差不多了,不多赘述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值