构造回文字符串(最长公共子序列)----腾讯2017暑期实习生编程题
来源:互联网 发布:centos 7 阿里云 编辑:程序博客网 时间:2024/05/20 11:20
给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。
输入描述:
输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.
输出描述:
对于每组数据,输出一个整数,代表最少需要删除的字符个数。
输入例子:
abcdagoogle
输出例子:
22
比较简单的想法就是求原字符串和其反串的最大公共子串的长度,然后用原字符串的长度减去这个最大公共子串的长度就得到了最小编辑长度。(注:最大公共子串并不一定要连续的,只要保证出现次序一致即可看作公共子串)
<span style="font-size:18px;">#include <iostream>#include <string>#include <vector>#include <algorithm> using namespace::std ;/* LCS 算法,求出最长公共子序列的长度 */int lcs(string str1, string str2) {int len1 = str1.size();int len2 = str2.size();vector<vector<int>> c(len1 + 1, vector<int>(len2 + 1, 0));for (int i = 0; i <= len1; i++) {for (int j = 0; j <= len2; j++) {if (i == 0 || j == 0) {c[i][j] = 0;}else if (str1[i - 1] == str2[j - 1]) {c[i][j] = c[i - 1][j - 1] + 1;}else {c[i][j] = c[i - 1][j] > c[i][j - 1] ? c[i - 1][j] : c[i][j - 1];}}}int test = str1.size() - str2.size();return c[len1][len2];}int main() { string input ; while ( cin >> input ) { string reverse_input = input; reverse(reverse_input.begin(),reverse_input.end()); int lcs_length = lcs( input, reverse_input ) ; int result = input.size() - lcs_length ; cout << result << endl ; } return 0 ;}</span>
第二次做:
#include <string>#include <iostream>#include <algorithm>using namespace::std ;int lcs( string str1, string str2 ) { int len1 = str1.size() ; int len2 = str2.size() ; vector<vector<int>> c( len1 + 1, vector<int>( len2 + 1, 0 ) ) ; for ( int i = 0; i <= len1 ; ++ i ) { for ( int j = 0; j <= len2; ++ j ) { if ( i == 0 || j == 0 ) { c[i][j] = 0 ; } else if ( str1[i -1] == str2[j - 1] ) { c[i][j] = c[i - 1][j - 1] + 1 ; } else { c[i][j] = c[i - 1][j] > c[i][j - 1] ? c[i - 1][j] : c[i][j - 1] ; } } } return c[len1 ][len2] ;}int main() { string input ; while ( cin >> input ) { string reverse_input = input ; reverse( reverse_input.begin(), reverse_input.end() ) ; int lcs_length = lcs( input, reverse_input ) ; cout << input.size() - lcs_length << endl ; } return 0 ; }
第三次做:
#include <iostream>#include <string>#include <vector>#include <algorithm>using namespace::std ;int lcs( string str1, string str2 ) { int length1 = str1.size() ; int length2 = str2.size() ; vector<vector<int>> vec( length1 + 1, vector<int>( length2 + 1, 0 ) ) ; for ( int i = 0; i <= length1; ++ i ) { for ( int j = 0; j <= length2; ++ j ) { if ( i == 0 || j == 0 ) vec[i][j] = 0 ; else if ( str1[i - 1] == str2[j - 1] ) vec[i][j] = vec[i - 1][j - 1] + 1 ; else vec[i][j] = vec[i - 1][j] > vec[i][j - 1] ? vec[i - 1][j] : vec[i][j - 1] ; } } return vec[length1][length2] ;}int main() { string input ; while ( cin >> input ) { string reverse_input = input ; reverse( reverse_input.begin(), reverse_input.end() ) ; int lcs_length = lcs( input, reverse_input ) ; cout << input.size() - lcs_length << endl ; } return 0 ;}
第四次做:
#include <iostream>#include <string>#include <algorithm>using namespace::std ;int main() { string input ; while ( cin >> input ) { if ( input.empty() == true ) break ; string str = input ; reverse( str.begin(), str.end() ) ; vector<vector<int>> vec( input.size() + 1, vector<int>( str.size() + 1, 0 ) ) ; for ( int i = 0; i <= input.size(); ++ i ) { for ( int j = 0; j <= str.size(); ++ j ) { if ( i == 0 || j == 0 ) { vec[i][j] = 0 ; } else if ( input[i - 1] == str[j - 1] ) { vec[i][j] = vec[i - 1][j - 1] + 1 ; } else { int tmp = max( vec[i - 1][j], vec[i][j - 1] ) ; vec[i][j] = tmp ; } } } int lcs = vec[input.size()][str.size()] ; int result = input.size() - lcs ; cout << result << endl ; } return 0 ;}
0 0
- 构造回文字符串(最长公共子序列)----腾讯2017暑期实习生编程题
- 2017百度校园招聘编程题 删除字符构造最长回文字符串(求最长公共子序列的变种)
- 腾讯2017暑期实习生编程题-构造回文
- 构造回文--腾讯2017暑期实习生编程题
- 腾讯2017暑期实习生编程题-A-构造回文
- 腾讯2017暑期实习生编程题之构造回文
- 腾讯2017暑期实习生编程题--构造回文
- 腾讯2017暑期实习生编程题:构造回文 [python]
- 腾讯2017暑期实习生编程题——构造回文串
- 算法与数据结构——算法题 79:构造回文(腾讯2017暑期实习生编程题) ? 待解决
- 构造回文 && 最长公共子序列
- 【jzoj4889】【最长公共回文子序列】【字符串】
- 回文字符串【最长公共子序列】【DP】
- 回文字符串-最长公共子序列
- NYOJ 37 回文字符串(类似最长公共子序列)
- NYOJ-37-回文字符串(最长公共子序列)
- NYOJ 37 回文字符串 (lcs最长公共子序列)
- 1092 回文字符串(最长公共子序列)
- 开门狗
- July 14th 模拟赛C T2 数码问题 Solution
- 为什么要使用Java泛型
- TouchImageView --------- 控件放大缩小工具类
- [LeetCode]Add Binary
- 构造回文字符串(最长公共子序列)----腾讯2017暑期实习生编程题
- 【Java】重载与重写的区别
- 揭秘淘宝286亿海量图片存储与处理架构
- 其他
- 2016暑假第一次测验(7-14)
- 关于Redhat的shell、用户管理和快捷键总结
- tungsten-replicator问题与解决方法
- 发送消息(SendMessage)常识普及
- 《Java编程思想》学习笔记(第二十一章):并发