leetcode 1048. Longest String Chain
题意:给一个字符串数组,求最长的一条链,当这条链中,后一个字符串可以由前一个字符串增加一个字符而成。第一个字符串可以任意。
思路:也是暴力搜索,以任意一个字符串作为起点,看看当前字符串长度+1的字符串中,又能满足条件的。若满足,则继续搜。
代码:
class Solution {
public:
int longestStrChain(vector<string>& words) {
for (auto str : words)
{
mp[str] = true;
s[str.size()].push_back(str);
}
ans = 0;
sort(words.begin(), words.end(), [](string a, string b){
if (a.size() == b.size())
return a < b;
return a.size() < b.size();
});
for (auto str : words)
{
dfs(str,1);
}
return ans;
}
bool judge(string a, string b)
{
//cout << b << ":\t";
for (int i = 0; i<b.size(); i++)
{
string tmp = "";
for (int j = 0; j < b.size(); j++)
{
if (j != i)
tmp += b[j];
}
if (tmp == a)
return true;
}
return false;
}
void dfs(string now,int level)
{
if (vis[now] == false)
vis[now] = true;
else
return;
if (level > ans)
ans = level;
for (auto str : s[now.size()+1])
{
if (judge(now, str))
{
dfs(str,level + 1);
}
}
}
private:
vector<string> s[20];
map<string, bool> mp;
map<string, bool> vis;
int ans;
};