华为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(); }}
阅读全文
0 0
- 华为OJ——字符串运用-密码截取
- 华为OJ——字符串运用-密码截取
- 华为OJ——字符串运用-密码截取
- 【华为oj】字符串运用-密码截取
- 华为OJ(字符串运用-密码截取)
- 华为oj 字符串运用-密码截取
- 字符串运用-密码截取(华为oj)
- 【华为OJ】【027-字符串运用-密码截取】
- 【华为OJ】【057-字符串运用-密码截取】
- 华为OJ:字符串运用-密码截取
- 华为OJ 字符串运用-密码截取
- 华为oj中级 字符串运用-密码截取
- 华为OJ字符串运用-密码截取
- 华为OJ基础题-字符串运用-密码截取
- 华为OJ中级题-字符串运用-密码截取
- [华为OJ--C++]057-字符串运用-密码截取
- 华为oj中级 【中级】字符串运用-密码截取
- 字符串运用—密码截取
- [C++] 模板高级
- windows10iot remote client分辨率低问题
- Android面试
- jsp标签
- eclipse-tomcat部署maven项目方式之二
- 华为OJ——字符串运用-密码截取
- 当Mongo客户端在启动的时候提示由于目标计算机积极拒绝,无法连接问题解决
- JVM(四)—一道面试题搞懂JVM类加载机制
- 动态规划——洛谷1880石子合并
- WinDbg设置和常用调试命令
- oracle基本查询
- Windows编程之旅(一)
- npm命令详解
- Built-in shader helper functions //内置的着色器辅助函数