对称字符串
输入一个字符串s,我们可以删除字符串s中的任意字符,让剩下的字符串形成一个对称字符串,且该字符串为最长对称字符串。如:输入google,则找到最长对称字符串为goog;如输入abcda则能找到3个最长对称字符串为aba/aca/ada。 若最长对称字符串存在多个,则输出多个相同长度的最长对称字符串,且字符串中不包含特殊字符。
输入一个字符串s,我们可以删除字符串s中的任意字符,让剩下的字符串形成一个对称字符串,且该字符串为最长对称字符串。如:输入google,则找到最长对称字符串为goog;如输入abcda则能找到3个最长对称字符串为aba/aca/ada。 若最长对称字符串存在多个,则输出多个相同长度的最长对称字符串,且字符串中不包含特殊字符。
package com.itheima.test;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* Test1
*
* @author: 王思雨
* 2020-10-10 21:42
**/
public class Test1 {
public static void main(String[] args) {
String str1 = "google";
String str2 = "abcda";
List<String> res1 = find(str1);
List<String> res2 = find(str2);
print(res2);
print(res1);
}
private static List<String> find(String str){
// 参数1
List<String> list = new ArrayList<String>();
// 参数2
char[] c = str.toCharArray();
// 参数3
StringBuffer sb = new StringBuffer();
for (int i = 1; i <= c.length; i++) {
getAllSubs(c, 0, i, sb, list);
}
//去重
Set<String> set = new HashSet<String>();
set.addAll(list);
list.clear();
list.addAll(set);
// 这个顺序很重要,差点被坑
List<String> list1 = getRel(list);
List<String> list2 = getRelsult(list1);
return list2;
}
/**
* 获取所有情况
*
* @param c
* @param begin
* @param len
* @param sb
* @param list
* @return
*/
private static List<String> getAllSubs(char[] c, int begin, int len, StringBuffer sb, List<String> list) {
if (len == 0) { //当都选择结束时打印sb内容
String s = sb + "";
//排除含有特殊符号和长度等于1的字符串
if (s.matches("[A-Za-z0-9]*") && (s.length() > 1)) {
list.add(s);
}
return list;
}
if (begin == c.length)
return list;
sb.append(c[begin]); //取
getAllSubs(c, begin + 1, len - 1, sb, list); //剩下的里面选len-1个
sb.deleteCharAt(sb.length() - 1); //不取
getAllSubs(c, begin + 1, len, sb, list); //剩下的里面选len个
return list;
}
/**
* 筛选
* 将字符串反转后如果和原来相等,则证明是对称的,将对称的字符串放到list中
* @param list
* @return
*/
public static List<String> getRel(List<String> list) {
List<String> list2 = new ArrayList<String>();
//遍历list中的字符串
for (String s : list) {
//判断反转后是否相等
StringBuilder sb = new StringBuilder(s);
if (s.equals(sb.reverse().toString())) {
list2.add(s);
}
}
return list2;
}
/**
* 获取list中的对称字符串的最大长度,如果有多个分别输出
* 此刻list中都是对称字符
*
* @param list
* @return
*/
public static List<String> getRelsult(List<String> list) {
List<String> list2 = new ArrayList<String>();
int maxLen = 0;
//求最大字符串的长度
for (int i = 0; i < list.size(); i++) {
if (list.get(i).length() > maxLen) {
maxLen = list.get(i).length();
}
}
//遍历集合,输出符合要求的字符串
for (String s : list) {
if (s.length() == maxLen) {
list2.add(s);
}
}
return list2;
}
/**
* 打印list
* @param list
*/
public static void print(List<String> list) {
for (String s : list) {
System.out.print(s + " ");
}
System.out.println();
}
}
我对任何唾手而得,快速,出自本能,即兴,含混的事物没有信心。我相信缓慢,平和,细水长流的力量,踏实,冷静。我不相信缺乏自律精神和不自我建设,不努力,可以得到个人或集体的解放。