【华为OJ】【027-字符串运用-密码截取】

【华为OJ】【算法总篇章】


【华为OJ】【027-字符串运用-密码截取】

【工程下载】


题目描述

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

输入描述

输入一个字符串

输出描述

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

输入例子

ABBA

输出例子

4

算法实现

import java.util.Scanner;

/**
 * Author: 王俊超
 * Date: 2015-12-24 10:57
 * Declaration: All Rights Reserved !!!
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
//        Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data.txt"));
        while (scanner.hasNext()) {
            String input = scanner.nextLine();
            String reverse = new StringBuilder(input).reverse().toString();
            System.out.println(findMaxSubstring(input, reverse));
        }

        scanner.close();
    }

    /**
     * Substring问题不光要求下标序列是递增的,还要求每次
     * 递增的增量为1, 即两个下标序列为:
     * < i, i+1, i+2, ..., i+k-1 > 和 < j, j+1, j+2, ..., j+k-1 >
     * 类比Subquence问题的动态规划解法,Substring也可以用动态规划解决,令
     * c[i][j]表示【包含Xi字符】和【Yi字符】的最大Substring的长度,比如
     * X = < y, e, d, f >
     * Y = < y, e, k, f >
     * c[1][1] = 1
     * c[2][2] = 2
     * c[3][3] = 0
     * c[4][4] = 1
     * 动态转移方程为:
     * 如果xi == yj, 则 c[i][j] = c[i-1][j-1]+1
     * 如果xi != yj,  那么c[i][j] = 0
     * 最后求Longest Common Substring的长度等于
     * max{c[i][j],  1 <= i <= n, 1 <= j<= m}
     *
     * @param a
     * @param b
     * @return
     */
    private static int findMaxSubstring(String a, String b) {

        int aLen = a.length() + 1;
        int bLen = b.length() + 1;
        int max = 0;
        int x = 0;

        // 初始值都为0
        int[][] c = new int[aLen][bLen];

        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;
    }
}
时间: 2025-01-04 08:50:55

【华为OJ】【027-字符串运用-密码截取】的相关文章

华为测试 字符串运用-密码截取

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

华为OJ:2290 字符串最后一个单词的长度

用JAVA就很简单,只要用spilt函数,再输出最后一个字符串. 题意是要求你先自己写分隔好字符串这样子.有个比较坑的地方就是测试用例应该有个全为空的,要注意. import java.util.Scanner; public class Main { public static void main(String args[]){ Scanner input=new Scanner(System.in); String s=input.nextLine(); String ss[]=s.spli

华为OJ平台——字符串分隔

题目描述: 连续输入字符串,请按长度为8拆分每个字符创 后输出到新的字符串数组: 长度不是8整数倍的字符串请在后面补数字0,空字符串不处理 输入 连续输入字符串(输入两次,每个字符长长度小于100)输出 输出到长度为8,的新字符串数组样例输入 abc 123456789样例输出 abc00000 12345678 90000000 思路: 都是直接处理,没有具体的方法而言 注意点: 华为的OJ平台的输入输出有点坑,好多次的程序都在这里出问题,在Eclipse上运行的结果没问题,然后在OJ上就是编

华为OJ:字符串加解密

题目描述 1.对输入的字符串进行加解密,并输出. 2加密方法为: 当内容是英文字母时则用该英文字母的后一个字母替换,同时字母变换大小写,如字母a时则替换为B:字母Z时则替换为a: 当内容是数字时则把该数字加1,如0替换1,1替换2,9替换0: 其他字符不做变化. 3.解密方法为加密的逆过程. 接口描述: 实现接口,每个接口实现1个基本操作: void Encrypt (char aucPassword[], char aucResult[]):在该函数中实现字符串加密并输出 说明: 1.字符串以

华为OJ:字符串合并处理

字符串合并处理 按照指定规则对输入的字符串进行处理. 详细描述: 将输入的两个字符串合并. 对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序.这里的下标意思是字符在字符串中的位置. 对排训后的字符串进行操作,如果字符为‘0’——‘9’或者‘A’——‘F’或者‘a’——‘f’,则对他们所代表的16进制的数进行BIT倒序的操作,并转换为相应的大写字符.如字符为‘4’,为0100b,则翻转后为0010b,也就是2.转换后的字符为‘2’: 如字符为‘7’,为0111b

华为OJ平台——字符串通配符

题目描述: 在计算机中,通配符一种特殊语法,广泛应用于文件搜索.数据库.正则表达式等领域.现要求各位实现字符串通配符的算法.要求:实现如下2个通配符: *:匹配0个或以上的字符(字符由英文字母和数字0-9组成,不区分大小写.下同)(不包含. , 等特殊字符) ?:匹配1个字符 输入 通配符表达式: 一组字符串. 输出 返回匹配的结果,正确输出true,错误输出false 思路: 分三种情况: (1)无通配符的情况:对应的字符要完全相等,否则匹配失败,输出false (2)通配符为?的情况:对应的

【中级】字符串运用-密码截取

import java.util.Scanner; public class CodeCut { public static void main(String[] args) { Scanner scan = new Scanner(System.in); String str = scan.nextLine(); StringBuffer sb = new StringBuffer(str); String str1 = sb.reverse().toString(); String resu

字符串运用-密码截取,字符串中的最长的回文串

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

【华为OJ】【057-字符串运用-密码截取】

[华为OJ][算法总篇章] [华为OJ][057-字符串运用-密码截取] [工程下载] ----这里写代码片 题目描述 Catcher是MCA国的情报员,他工作时发现敌国会用一些对称的密码进行通信,比如像这些ABBA,ABA,A,123321, 但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解.比如进行下列变化 ABBA->12ABBA,ABA->ABAKK, 123321->51233214 .因为截获的串太长了,而且存在多种可能的情况(abaaab可看作是aba,或baa