zoukankan      html  css  js  c++  java
  • 华为机试-字符串运用密码截取

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

    输入描述:

    输入一个字符串

    输出描述:

    返回有效密码串的最大长度

    示例1

    输入

    复制
    ABBA

    输出

    复制
    4

    import java.util.*;
    
    public class Main {
    
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            while (in.hasNext()) {
                String string = in.nextLine();
                int[] dp = new int[string.length()];
                for (int i = 0; i < dp.length; i++) {
                    dp[i] = 1;
                }
                for (int i = 1; i < string.length(); i++) {
                    int left = i-1;
                    int right = i;
                    while (left >= 0 && right < string.length()) {
                        if (string.substring(left, left+1).equals(string.substring(right,right+1))) {
                            left--;
                            right++;
                            if (right - left - 1 > dp[i]) {
                                dp[i] = right - left - 1;
                            }
                        } else {
                            break;
                        }
                    }
                    left = i-1;
                    right = i+1;
                    while (left >= 0 && right < string.length()) {
                        if (string.substring(left, left+1).equals(string.substring(right,right+1))) {
                            left--;
                            right++;
                            if (right - left - 1 > dp[i]) {
                                dp[i] = right - left - 1;
                            }
                        } else {
                            break;
                        }
                    }
                }
                int max = 0;
                
                for (int i = 0; i < dp.length; i++) {
                    //System.out.print(dp[i]+" ");
                    if(dp[i] > max) {
                        max = dp[i];
                    }
                }
                System.out.println(max);
            }
        }
    }

    思路:以选中字符为偶数或奇数回文的中心计算最大回文长度

  • 相关阅读:
    深入理解Aspnet Core之Identity(1)
    vscode同步插件 sync(gist,token)
    括号匹配问题
    EI目录下载地址及保护密码
    极简单的方式序列化sqlalchemy结果集为JSON
    OpenCvSharp 通过特征点匹配图片
    HttpWebRequest提高效率之连接数,代理,自动跳转,gzip请求等设置问题
    子网掩码划分
    使用批处理复制并以时间规则重命名文件
    九步确定你的人生目标
  • 原文地址:https://www.cnblogs.com/shineyoung/p/10566637.html
Copyright © 2011-2022 走看看