Java实现实现简单算法之最长对称字符串

题目:已知一字符串,求其内包含的最长对称字符串,例:已知字符串:google,输出最长对称字符串:goog,已知abada,输出aba,已知sdghjdgzzgdah,输出:dgzzgd。

        看到题目时,大家第一反应都是模棱两可的,好像可以这样干,好像又不知道从哪里下手,这些都是正常的,那接下来小编带大家将问题分解,逐步实现。

        1、判断字符串是否对称

        2、获取字符串所有的对称子串

        3、获取最长的对称子串

        如上述,拆解之后,自然就顺利多了,那接下来我们就看看到底怎么来实现每一步:

首先判断字符串是否对称,假如字符串长度维为n,我们只需要判断第0位和第n-1位是否相同,接下来继续判断第1位和n-2位是否相同,也就是循环判断第i位和第n-i-1位是否相等,一直到i>=n-i-1这个条件满足为止。

    /**
     * 判断字符串是否对称
     * @param str
     * @return
     */
    private static boolean check(String str) {
        if (str == null || str.length() <= 1) {
            return false;
        }
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) != str.charAt(str.length() - i - 1)) {
                return false;
            }
        }
        return true;
    }

接下来我们看看完整代码:

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

/**
 * 找出最长对称字符串
 *
 * @author tobiasy
 */
public class MaxSymmetric {
    public static void main(String[] args) {
        // TODO 输出最长对称字符串:goog
        String input1 = "google";
        // TODO 输出最长对称字符串:aba
        String input2 = "abada";
        // TODO 输出2个最长对称字符串:pop/upu
        String input3 = "pop-upu";

        start("sdghjdgzzgdah");
    }

    /**
     * 启动方法
     * @param str
     */
    private static void start(String str) {
        List<String> list = maxSubSymmetric(str);
        if (list.isEmpty()) {
            System.err.println("没有找到对称字串!");
        }
        list.forEach(System.out::println);
    }

    /**
     *  获取字符串中最长的对称字串
     * @param str
     * @return
     */
    private static List<String> maxSubSymmetric(String str) {
        List<String> result = new ArrayList<>();
        List<String> list = allSubSymmetric(str);
        Integer length = 0;
        for (String s : list) {
            if (s.length() > length) {
                length = s.length();
            }
        }
        for (String s : list) {
            if (s.length() <= length) {
                result.add(s);
            }
        }
        return result;
    }

    /**
     * 获取所有的对称字串
     * @param str
     * @return
     */
    private static List<String> allSubSymmetric(String str) {
        List<String> list = new ArrayList<>();
        for (int i = 0; i <= str.length(); i++) {
            for (int j = i; j <= str.length(); j++) {
                String sub = str.substring(i, j);
                if (check(sub)) {
                    list.add(sub);
                }
            }
        }
        return list;
    }

    /**
     * 判断字符串是否对称
     * @param str
     * @return
     */
    private static boolean check(String str) {
        if (str == null || str.length() <= 1) {
            return false;
        }
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) != str.charAt(str.length() - i - 1)) {
                return false;
            }
        }
        return true;
    }

猜你喜欢

转载自blog.csdn.net/m0_37649480/article/details/127018340