【华为机试题:密码截取(中心扩展法解决回文问题)】

题目链接:https://www.nowcoder.com/practice/3cd4621963e8454594f00199f4536bb1?tpId=37&tags=&title=&diffculty=0&judgeStatus=0&rp=1

什么是回文?

  • 回文串:字符串字符从前往后与从后往前一致(中心对称)

题目描述

  • Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码进行通信,比如像这些ABBA,ABA,A,123321,但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解。比如进行下列变化 ABBA->12ABBA,ABA->ABAKK,123321->51233214 。因为截获的串太长了,而且存在多种可能的情况(abaaab可看作是aba,或baaab的加密形式),Cathcer的工作量实在是太大了,他只能向电脑高手求助,你能帮Catcher找出最长的有效密码串吗?

输入描述:

  • 输入一个字符串(例如:ABBA)

输出描述:

  • 返回有效密码串的最大长度(4)

分析:暴力解采用双指针从两侧向中心搜索,复杂度可达O(n^3),复杂度太高,所以我们用另外一个方法:中心扩展法,把复杂度降低到 O(n ^2)

中心扩散:就是选定一个值 i ,然后向左右扩散。我们可以发现,回文串有两种,一种是aabb,中心在ab之间;另一种是aacbb,中心为c;我们要分类讨论

代码:

public class Main{
    
    
    public static void main(String[] args)throws Exception{
    
    
      BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
        String str;
        while((str=reader.readLine())!=null){
    
    
            int max=0;
            char[] arr=str.toCharArray();
            for(int i=1;i<arr.length;i++){
    
    
                int left=i-1;
                int right=i;
                while(left>=0&&right<arr.length&&arr[left]==arr[right] ){
    
    
                    if(right-left+1>max){
    
    
                        max=right-left+1;
                    }
                    left--;
                    right++;
                }
               left=i-1;
                right=i+1;
                while(left>=0&&right<arr.length&&arr[left]==arr[right] ){
    
    
                    if(right-left+1>max){
    
    
                        max=right-left+1;
                    }
                    left--;
                    right++;
                }
            }
            System.out.println(max);
        }
         
    }
 
}

猜你喜欢

转载自blog.csdn.net/qq_44682003/article/details/113134091