zoukankan      html  css  js  c++  java
  • 一次面试,回文字符串的实现

    记一次面试:求一个字符串的最大回文子字符串

    1.回文字符串的分类

    1.1 单核回文 abcba

    1.2 双核回文 abccba

    2 解题方法

    2.1 暴力求解

     /**
         * 暴力求解
         * 1.遍历字符串,
         * 2,判断其子字符串是否回文,这里的子字符串是依次减少的
         * 3.如果回文,就结束循环,返回最长的回文字符串
         * 时间复杂度On3(有点高)
         */
        public static String longestPalindrome(String str){
           
           if (str.length() <= 1) {
                return str;
            }
            
            for (int i = str.length(); i > 0; i--) {
                for (int j = 0;  j<str.length()-i-1; j++) {
                    String sub = str.substring(j,i+j); // 得到子字符串
                    int count = 0;
                    
                    // 判断是否回文
                    for (int k = 0; k <sub.length()/2 ; k++) {
                        if(sub.charAt(k) == sub.charAt(sub.length()-k-1)){
                            count++;
                        }
                    }
                    if(count == sub.length()/2){
                        return sub;
                    }
                }
            }
            return ""; // 没有找到最长的字符串
        }
        
    

    2.2 声明两个高低指针,找到回文字符串的核,然后向两边扩展

     /**
        1)将子串分为单核和双核的情况,单核即指子串长度为奇数,双核则为偶数;
    
        2)遍历每个除最后一个位置的字符index(字符位置),单核:初始low = 初始high = index,low和high均不超过原字符串的下限和上限;判断low和high处的字符是否相等,相等则low++、high++(双核:初始high = 初始low+1 = index + 1);
    
        3)每次low与high处的字符相等时,都将当前最长的回文子串长度与high-low+1比较。后者大时,将最长的回文子串改为low与high之间的;
    
        4)重复执行2)、3),直至high-low+1 等于原字符串长度或者遍历到最后一个字符,取当前截取到的回文子串,该子串即为最长的回文子串。
         */
        public static String longestPalindrome1(String str){
    
            if(str.length() <= 1){
                return str;
            }
            for (int i = 0; i < str.length()-1; i++) {
                findLongPlaindrome(str,i,i); // 单核
                findLongPlaindrome(str,i,i+1);  // 双核
            }
            return sub;
        }
    
        /**
         * 核心思想是声明两个指针,找到这个回文字符串的核,然后向两边外扩展
         * @param str 目标字符串
         * @param low 低指针
         * @param high 高指针
         */
        private static void findLongPlaindrome(String str, int low, int high) {
            while(low >= 0 && high <= str.length()-1){
                if(str.charAt(low) == str.charAt(high)){
                    if(high-low+1 > maxLength){
                        maxLength = high-low+1;
                        sub = str.substring(low, high + 1);
                    }
                    low--;
                    high++;
                }else{
                    break;
                }
            }
    
        }
    

    3 测试

       public static void main(String[] args) {
            String test = "abcbadefg";
            test = FindMaxLengthSubString.longestPalindrome(test);
            //test = FindMaxLengthSubString.longestPalindrome1(test);
            System.out.println(test);
        }
    

    结果

     abcba
    

    参考
    https://blog.csdn.net/qq_32354501/article/details/80084325

  • 相关阅读:
    opencv-活体检测
    人脸识别
    Opencv-python基本操作
    白话深度学习与Tensorflow(二)
    Linux系统入门(一)-未完成
    编程题29 题目:求对角线元素之和
    编程题28 题目 排序
    编程题27 题目:求100之内的素数
    编程题 18兵乓球比赛
    编程题21 求阶数总和
  • 原文地址:https://www.cnblogs.com/chentang/p/13917998.html
Copyright © 2011-2022 走看看