对称字符串

输入一个字符串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();

    }
}


posted @ 2021-12-11 22:38  姚狗蛋  阅读(69)  评论(0编辑  收藏  举报