2021-10-11

找出最长对称字符串

题目如下所示

    // TODO 输出最长对称字符串:goog
    String input1 = "google";

    // TODO 输出3个最长对称字符串:aba/aca/ada
    String input2 = "abcda";

    // TODO 输出2个最长对称字符串:pop/upu,不会输出特殊字符的对称字符串p-p
    String input3 = "pop-upu";

以下代码使用Java语言

package com.wz.demo;

import java.util.ArrayList;
import java.util.List;

/**
 * 找出最长对称字符串
 *
 * @author Your Name
 */
public class Test1 {
    public static void main(String[] args) {
        // TODO 输出最长对称字符串:goog
        String input1 = "google";

        // TODO 输出3个最长对称字符串:aba/aca/ada
        String input2 = "abcda";

        // TODO 输出2个最长对称字符串:pop/upu,不会输出特殊字符的对称字符串p-p
        String input3 = "pop-upu";

        String input4 = "ababab";
        String input5 = "abcedecba";
        List<String> result = findMaxLengthSymmetryStr(input2);
        System.out.println(result);

    }

    private static List<String> findMaxLengthSymmetryStr(String input) {
        List<String> symmetryStrs = new ArrayList<>();
        //根据字符和数字以外的特殊字符作为正则切割字符串
        String[] split = input.split("\\W");
        for (String str : split) {
            for (int i = 0; i < str.length(); i++) {
                char left = str.charAt(i);
                String remainingStr = "";
                StringBuilder sb = new StringBuilder();
                for (int j = str.length() - 1; j > i; j--) {
                    char right = str.charAt(j);
                    if (left == right) {
                        sb.append(left);
                        if (j > i + 1) {
                            String substring = str.substring(i + 1, j);
                            if (substring.length() == 1 || !containsDuplicateChar(substring)) {
                                remainingStr = substring;
                            } else {
                                remainingStr = loopFind(sb, substring);
                            }
                        }
                        break;
                    }
                }

                if (sb.length() == 0) {
                    continue;
                }
                if (remainingStr.length() > 0) {
                    for (char c : remainingStr.toCharArray()) {
                        symmetryStrs.add(sb.toString() + c + sb.reverse().toString());
                    }
                } else {
                    symmetryStrs.add(sb.toString() + sb.reverse().toString());
                }
            }
        }

        return getMaxlengthStrs(symmetryStrs);
    }

    private static String loopFind(StringBuilder sb, String subStr) {
        String remainingStr = "";
        a:
        for (int i = 0; i < subStr.length(); i++) {
            char left = subStr.charAt(i);
            for (int j = subStr.length() - 1; j > i; j--) {
                char right = subStr.charAt(j);
                if (left == right) {
                    sb.append(left);
                    if (j > i + 1) {
                        String substring = subStr.substring(i + 1, j);
                        if (substring.length() == 1 || !containsDuplicateChar(substring)) {
                            return substring;
                        }
                        remainingStr = loopFind(sb, substring);
                    }
                    break a;
                }
            }
        }
        return remainingStr;
    }

    /**
     * 筛选出字符串集合中 长度最长的字符串,结果可能是多个
     *
     * @param strings
     * @return
     */
    private static List<String> getMaxlengthStrs(List<String> strings) {
        List<String> result = new ArrayList<>();
        int max = 1;
        for (String string : strings) {
            if (string.length() > max) {
                max = string.length();
                result.clear();
                result.add(string);
            } else if (string.length() == max) {
                result.add(string);
            }
        }
        return result;
    }

    /**
     * 判断字符串中是否有重复的字符出现
     *
     * @param str
     * @return
     */
    private static boolean containsDuplicateChar(String str) {
        for (char c : str.toCharArray()) {
            int start = str.indexOf(c);
            int end = str.lastIndexOf(c);
            if (start != end) {
                return true;
            }
        }
        return false;
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值