Java基础算法之找出一段字符串中所有回文串、最长的回文串以及最长回文串长度
- 回文的含义是:字符串从左向右看和从右向左看是相同的,例如:abba,1234321。
- 单一字符亦是回文串
package com.zhaowl.interview.base;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 获取最长回文串
* 回文的含义是:子串从左向右看和从右向左看是相同的,例如:abba,1234321。
* 注意:单一字符亦是回文串
*
* @author : Create by 半路勇者 at 2020/11/24 16:03
*/
@Slf4j
public class LongestPalindromicSubstring {
/**
* 判断字符串是否是回文串
*
* @param string 字符串
* @return 是否是回文串
*/
public static boolean isPalindromic(String string) {
return string.equalsIgnoreCase(new StringBuffer(string).reverse().toString());
// 用如下方法判断是否是回文串,则会忽略掉单一字符
/*int length = string.length();
boolean bool = false;
for (int i = 0; i < length / 2; i++) {
bool = (string.charAt(i) == string.charAt(length - i - 1));
if (!bool) {
break;
}
}
return bool;*/
}
/**
* 一段一段的截取,判断是否是回文串
*
* @param string 字符串
* @return 最长回文串以及长度
*/
public static Map<String, Object> getLongestPalindromic(String string) {
Map<String, Object> map = new HashMap<>();
// 所有回文串集合
List<String> strings = new ArrayList<>();
// 如果字符串为空,返回空
if (string == null || string.equals("") || string.length() == 0) {
return null;
}
// 保存最长回文串
String maxStr = null;
// 保存回文串长度
int length = 0;
// 保存最长回文串长度
int maxLength = 0;
for (int i = 0; i < string.length(); i++) {
/*
* 这里之所以设置j <= string.length(),是避免字符串本身就是一个回文串,原因如下
* substring(beginIndex, endIndex)
* endIndex:输入的数值减1
*/
for (int j = i + 1; j <= string.length(); j++) {
String sub = string.substring(i, j);
// 找到回文串则缓存该串长度,用于比较
if (isPalindromic(sub)) {
strings.add(sub);
length = sub.length();
}
// 如果该串长度大于上一个回文串,则最大长度设置为当前回文串长度,并缓存当前回文串为最大长度回文串
if (length > maxLength) {
maxLength = length;
maxStr = sub;
}
// 回文串长度初始化为0,并进行下一次循环截取
length = 0;
}
}
map.put("maxLength", maxLength);
map.put("maxStr", maxStr);
map.put("strings", strings);
return map;
}
public static void main(String[] args) {
String string = "1234321";
Map<String, Object> map = getLongestPalindromic(string);
// 7
log.info("最长回文串长度:" + map.get("maxLength"));
// 1234321
log.info("最长回文字符串:" + map.get("maxStr"));
// [1, 1234321, 2, 23432, 3, 343, 4, 3, 2, 1]
log.info("所有回文串:" + map.get("strings"));
}
}