笔试题:2017.9.10爱奇艺校招编程题【平方串】解题思路
2017-09-16 02:19
477 查看
问题描述
平方串:形如string s = T + T的字符串
目标:
对于字符串s,除去若干字符使其成为平方串,求该平方串的最大长度。
思路与实现
将s分成两半,求两个子串的最大子序列长度(longest common subsequence)的最大值ans,最长平方串长度就是2*ans。const int MAXN = 50; int c[MAXN][MAXN] = { 0 }; // s - 输入串 // 左串是s[0...(s2-1)] // 右串是s[s2...] int lcs(string s, int s2){ if (s2 >= s.size()) return 0; int size1 = s2, size2 = s.size() - s2; for (int i = 1; i <= size1; i++){ for (int j = 1; j <= size2; j++){ if (s[i - 1] == s[s2 + j - 1]){ c[i][j] = c[i - 1][j - 1] + 1; } else{ c[i][j] = max(c[i - 1][j], c[i][j - 1]); } } } return c[size1][size2]; }
为了减少做LCS的次数,我先把输入串中的只出现一次的字符滤除掉,不过好像不是很必要
int main() { string s; cin >> s; int map[26] = { 0 }; for (int i = 0; i < s.size(); ++i){ map[s[i] - 'a']++; } string ns; for (int i = 0; i < s.size(); ++i){ if (map[s[i] - 'a'] > 1){ ns.push_back(s[i]); } } int ans = 0; for (int i = 1; i < ns.size(); i++){ int x = lcs(ns, i); if (x > ans) ans = x; } cout << ans * 2 << endl; //system("pause"); return 0; }
相关文章推荐
- 【补题】网易 2018 校招笔试编程题 - 解题思路
- 牛客网-网易2017春招笔试真题编程题集合-解题思路及源码
- 牛客网-网易2017内推笔试编程题合集(二)-解题思路及源码
- 递归的理解【爱奇艺2017年校招笔试题 第一道编程题】
- (网易2018校招笔试)[编程题] 字符串碎片
- (网易2018校招笔试)[编程题] 字符串碎片
- 爱奇艺笔试编程题 (学习之旅)
- 搜狗2016年校招笔试编程题记录+总结
- 2017年校招全国统一模拟笔试(第四场)编程题集合--Python
- 牛客网2017年校招全国统一模拟笔试(第一场)编程题 -- 好多鱼!
- 微软2016校招笔试 第一场部分题目个人思路
- 牛客网-网易2018校招内推编程题集合-解题思路及源码
- 2016 360校招笔试编程题
- 2017年校招全国统一模拟笔试(第一场)编程题集合——超级素数幂
- 企鹅2015校招笔试之(二)整形长度算法思路实现
- 【2018校招美团内推笔试编程题1】K的倍数
- 牛客网2017年校招全国统一模拟笔试(第一场)编程题集合
- Google 2015 校招第四轮在线技术笔试 解题报告
- 2018年美团校招前端WEB笔试编程题-最小的排列
- 2017年校招全国统一模拟笔试(第三场)编程题集合