腾讯2017暑期实习生编程题(一)----构造回文
2017-02-28 14:32
204 查看
腾讯2017暑期实习生编程题(一)—-构造回文
时间限制:1秒 空间限制:32768K
给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。
输入描述:
输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.
输出描述:
对于每组数据,输出一个整数,代表最少需要删除的字符个数。
输入例子1:
abcda google
输出例子1:
2 2
分析:回文串的特点是,逆序输出和正序输出是一样的。所以这道题可以从这方面来考虑。如果将此字符串逆序输出,那么两个字符串的最长公共子序列将是最长的回文字符串,那么剩余的值将是要删除的字符个数。求两个字符串的最长公共子序的方法参见我的另一篇博文—-C++实现最长公共子序列和最长公共子串
#include <iostream> #include <string> #include <vector> #include <algorithm> using namespace std; int lcs( string &str1,string &str2 ) { const int len1 = str1.length(); const int len2 = str2.length(); 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 || !j ){ c[i][j] = 0; continue; } if( str1[i-1] == str2[j-1] ) { c[i][j] = c[i-1][j-1] + 1; } else { if( c[i-1][j] > c[i][j-1] ) { c[i][j] = c[i-1][j]; } else { c[i][j] = c[i][j-1]; } } } } return c[len1][len2]; } int main() { string str; vector <string> v; while( getline(cin,str) && !str.empty() ) { v.push_back(str); } for( vector<string>::iterator iter = v.begin(); iter != v.end(); ++iter) { string str(*iter); reverse(str.begin(),str.end()); cout << str.length() - lcs(*iter,str) << endl; } return 0; }
大家有更好的解题思路可以讨论讨论。
相关文章推荐
- 腾讯2017暑期实习生编程题--构造回文
- 腾讯2017暑期实习生编程题-A-构造回文
- 腾讯2017暑期实习生编程题2--感觉薅了社会主义羊毛的做法
- 腾讯2017暑期实习生编程题
- 腾讯2017暑期实习生编程题
- 腾讯2017暑期实习生编程题-构造回文
- 腾讯2017暑期实习生编程题--算法基础-字符移位
- 腾讯2017暑期实习生编程题
- 腾讯2017暑期实习生编程题-字符移位
- 腾讯2017暑期实习生编程题
- 把一个字符串的大写字母放到字符串的后面--腾讯2017暑期实习生编程题
- 算法与数据结构——算法题 27:字符移位(腾讯2017暑期实习生编程题) ? 待解决
- 腾讯2017暑期实习生编程题
- 腾讯2017暑期实习生编程题(第二道)
- 腾讯2017暑期实习生编程题
- 腾讯2017暑期实习生编程题——构造回文串
- 腾讯2017暑期实习生编程题
- 算法与数据结构——算法题 67:有趣的数字(腾讯2017暑期实习生编程题) ? 待解决
- 腾讯2017暑期实习生编程题
- 腾讯2017暑期实习生编程题-字符移位