时间限制:3秒
空间限制:32768K
热度指数:352
算法知识视频讲解
题目描述
有一组单词,请编写一个程序,在数组中找出由数组中字符串组成的最长的串A,即A是由其它单词组成的(可重复)最长的单词。
给定一个string数组str,同时给定数组的大小n。请返回最长单词的长度,保证题意所述的最长单词存在。
测试样例:
["a","b","c","ab","bc","abc"],6
返回:3
思路:先遍历一遍,构造哈希,然后遍历列表,将每个单词分成可能的两半,通过哈希查找看左右两半是否在列表内,在就记录,并且更新最长。如果是多个单词组成,则将右半部分是否在列表中改为递归检查右半部分是否有列表中其他元素
代码如下:
#include<iostream>
#include<vector>
#include<map>
#include<queue>
#include<algorithm>
using namespace std;
bool compare(string str1, string str2)
{
return str1.size()<str2.size();
}
bool match(vector<string>& str, string s, int k) //判断第k+1个字符串能否由前k个字符串表示
{
for (int i = k - 1; i >= 0; i--)
{
if (str[i] == s)
return true;
if (str[i].size()<s.size())
break;
}
for (int i = 1; i<s.size(); i++)
{
if (match(str, s.substr(0, i), k) && match(str, s.substr(i), k))
return true;
}
return false;
}
int getLongest(vector<string> str, int n)
{
// write code here
int length = 0;
sort(str.begin(), str.end(), compare);
for (int i = str.size() - 1; i >= 0; i--)
{
if (match(str, str[i], i))
{
length = str[i].size();
break;
}
}
return length;
}
int main()
{
vector<string> v;
int m;
string temp;
while (cin >> m)
{
v.clear();
for (int j = 0; j < m; j++)
{
cin >> temp;
v.push_back(temp);
}
// printVector(getMiddle(v, m),m);
cout << getLongest(v, m) << endl;
}
return 0;
}
不懂的可以加我的QQ群:261035036(IT程序员面试宝典
群) 欢迎你的到来哦,看了博文给点脚印呗,谢谢啦~~