【华为OJ】【057-字符串运用-密码截取】
2016-05-14 08:24
337 查看
【华为OJ】【算法总篇章】
【华为OJ】【057-字符串运用-密码截取】
【工程下载】
———-这里写代码片
题目描述
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-25 15:20 * 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(); System.out.println(longestPalindrome(input)); } scanner.close(); } /** * 这道题本质是求字符串中的最大回文字串的长度 * 动态规划法, * 假设dp[ i ][ j ]的值为true,表示字符串s中下标从 i 到 j 的字符组成的子串是回文串。那么可以推出: * dp[ i ][ j ] = dp[ i + 1][ j - 1] && s[ i ] == s[ j ]。 * 这是一般的情况,由于需要依靠i+1, j -1,所以有可能 i + 1 = j -1, i +1 = (j - 1) -1, * 因此需要求出基准情况才能套用以上的公式: * a. i + 1 = j -1,即回文长度为1时,dp[ i ][ i ] = true; * b. i +1 = (j - 1) -1,即回文长度为2时,dp[ i ][ i + 1] = (s[ i ] == s[ i + 1])。 * 有了以上分析就可以写出代码了。需要注意的是动态规划需要额外的O(n^2)的空间。 * * @param s 待求字符串 * @return 最大回文字串的长度 */ private static int longestPalindrome(String s) { // 不考虑非法输入的情况,比如null int maxLen = 0; int len = s.length(); boolean[][] t = new boolean[len][len]; // 单个字符串都是回文 for (int i = 0; i < len; i++) { t[i][i] = true; maxLen = 1; } for (int i = 0; i < len - 1; i++) { if (s.charAt(i) == s.charAt(i + 1)) { t[i][i + 1] = true; maxLen = 2; } } // 求长度大于2的子串是否是回文串 for (int gap = 3; gap <= len; gap++) { for (int i = 0, j; (j = i + gap - 1) <= len - 1; i++) { if (s.charAt(i) == s.charAt(j)) { t[i][j] = t[i+1][j-1]; if (t[i][j] && gap > maxLen) { maxLen = gap; } } else { t[i][j] = false; } } } return maxLen; } }
相关文章推荐
- .NET Core全新的配置管理[共9篇]
- 字符串
- openjudge7627 鸡蛋的硬度
- docker动态映射运行的container端口
- SA后缀数组模板 文件修复
- python学习笔记-Day1
- 从Html到Jade
- Multipart/form-data POST文件上传详解
- Spring AOP的问与答
- 沿着路线寻路
- 【华为OJ】【056-统计大写字母个数】
- hdu 5676-ztr loves lucky numbers
- 分享iOS开发常用(三方类库,工具,高仿APP,实用网站,技术干货)
- shell实现输入密码显示星号
- 如何禁止GridView滑动
- MySQL删除数据后磁盘空间的释放情况
- 返回出现次数最多的数字
- yii2.0邮箱发送
- HDU 4757 Tree
- 发几个美女,证明博客还活着