华为OJ——字符串运用-密码截取

来源:互联网 发布:js获取input text的值 编辑:程序博客网 时间:2024/06/05 23:06

题目描述

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

  • 输入描述:

    输入一个字符串

  • 输出描述:

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

  • 示例1

    输入
    ABBA
    输出
    4

  • 动态转移方程为:

    • 如果xi == yj, 则 c[i][j] = c[i-1][j-1]+1
    • 如果xi != yj, 那么c[i][j] = 0

代码实现

  • 方法一(内存过大)

    注意:问题在于牛客网上提示内存超过限制,主要原因:定义二维数组时,若字符串长度过长,容易超内存限制,有待优化。

package cn.c_shuang.demo32;import java.util.Scanner;/** * 字符串运用-密码截取 * @author Cshuang * */public class Main {    public static void main(String[] args) {        Scanner in =new Scanner(System.in);        while(in.hasNext()){            String s=in.nextLine();            String sRever=new StringBuilder(s).reverse().toString();            //字符串与字符串反转后进行比较            System.out.println(findMaxCode(s,sRever));        }        in.close();    }    private static int findMaxCode(String a, String b) {        int aLen=a.length()+1;        int bLen=b.length()+1;//子所以要限制长度+1,方便c[0][0]        //事实上真正计数的从c[1][1]开始        int[][] c=new int[aLen][bLen];        int max=0;        for (int i = 1; i < aLen; i++) {            for (int j = 1; j < bLen; j++) {                if(a.charAt(i-1)==b.charAt(j-1)){                    c[i][j] = c[i-1][j-1]+1;                  }else{                    c[i][j]=0;                }                if(c[i][j]>max){                    max=c[i][j];                }            }        }        return max;    }}
  • 方法二(优解):

    思路:将字符串任意一点当做中心,来上下增减,来判断长度,其主要分为奇对称和偶对称情况。

package cn.c_shuang.demo32_1;import java.util.Scanner;/** * 字符串运用-密码截取 *  * @author Cshuang *  * 从字符的第二个字符开始遍历,分别将当前遍历的字符作为回文串的中心词, * 分为ABA和ABBA两种情况,算出每个字符作为中心词时最长回文串长度。 */public class Main {    public static void main(String[] args) {        Scanner in =new Scanner(System.in);        while(in.hasNext()){            String str=in.nextLine();            char[] ch=str.toCharArray();            int length=str.length();            int max=1;            for(int i=1;i<length;i++)            {                int j;                //对应ABA的奇对称情况                //对于ch[i-j]需限制i-j>=0                //对于ch[i+j]需限制i+j<length                for(j=1;(i-j>=0)&&((i+j)<length)&&ch[i-j]==ch[i+j];j++);                if(2*j-1>max)                {                    max=2*j-1;                }                //对应ABBA对称的情况(针对偶对称情况)                for(j=0;(i-1-j>=0)&&((i+j)<length)&&ch[i-1-j]==ch[i+j];j++);                if(2*j>max)                {                    max=2*j;                }            }            System.out.println(max);        }        in.close();    }}
原创粉丝点击