机测题目二:查找字符串内最长回文子字符串

例如:
输入: babad
输出:bab 或 aba

输入:cbbd
输出:bb

import java.util.*;

public class maxSubString {
	//  获取最长回文子字符串
	public static void main(String []Args){
		
		String strOri = "cbbd";
		
		ArrayList <String> subStrs = new ArrayList();
		String result ="";
		
		// 获取所有子串
		for(int i=0;i<strOri.length();i++){
			for(int j=i+1;j<=strOri.length();j++){
				String subStr = strOri.substring(i,j);
				subStrs.add(subStr);
			}
		}
		
		StringBuilder strRe = new StringBuilder(strOri);
		
		strRe.reverse();
			
		// 在逆序的字符串中查找
		for(String sub :subStrs){
			if(strRe.indexOf(sub)!=-1){
				if(result.length()<sub.length()){
					result=sub;
				}
			}
		}
		
		if(result!=""){
			System.out.println(result);
		}else{
			System.out.println("输入字符串中未出现回文子字符串");
		}
	}

}


2020.12.23 回顾这道题

时间几个月,重新回来看这道题,原来有一种情况没有考虑到,例如 aacashihfiahiacaa ,此时会输出 aaca ,可是 aaca并不是回文字符串,只是恰巧原字符串中有 “aaca”字符串的逆序。

看了官方的题解,有个 “动态检测”的解法(时间和空间复杂度都是 O(n^2) )感觉很好。核心的计算思路是,一个回文字符串(长度大于2),那么一定满足:
&nbsp 1. 起始和末尾的两个字符相等
&nbsp 2. 除去起始和末尾两个字符后的子字符串是回文字符串

所以,验证一个字符串是否是回文字符串,首先看首尾两个字母是否相等,其次看去掉首尾两个字符的子字符串是否是回文字符串

那么解法有了

class Solution {
    public String longestPalindrome(String s) {

		int length = s.length();
		// 存放是否是回文字符串的结果
        Boolean[][] result = new Boolean[length][length];

        String subStr = "";

        for(int subLen =0 ; subLen < length ; subLen++){
            for(int index =0;index + subLen < length ; index++){

                int subEnd = index +subLen;
				//子字符串长度为1,可以称为回文字符串
                if(subLen ==0){
                    result[index][subEnd] = true;
                //子字符串长度为2,只需判断首尾两个字符是否相同
                }else if(subLen ==1){
                    result[index][subEnd] = (s.charAt(index) == s.charAt(subEnd));
                //子字符串长度大于2,需要满足两个条件:1首尾字符相同 2除去首尾两个字符后的子字符串是回文字符串
                }else{
                    result[index][subEnd] = (s.charAt(index) == s.charAt(subEnd) && result[index+1][subEnd-1]);
                }
				// 与当前最长回文字符串做对比
                if(result[index][subEnd] && subLen +1 > subStr.length()){
                    subStr = s.substring(index,index+subLen+1);
                }
            }
        }

        return subStr;

    }
}

  一道小算法题,琢磨琢磨有点儿意思,做这些小算法题,一般会有一个体会,你会的可能比你以为的多那么一点点儿。。。。(最后也有可能发现自己有多渣,哎。。。。。。,)突然感觉没脸要赞了,随缘吧,朋友们

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值