题目描述
给你一个字符串 s 和一个字符串数组 dictionary 作为字典,找出并返回字典中最长的字符串,该字符串可以通过删除 s 中的某些字符得到。
如果答案不止一个,返回长度最长且字典序最小的字符串。如果答案不存在,则返回空字符串。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-word-in-dictionary-through-deleting
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题
要命了,我这瞎写的,麻烦死了
class Solution {
public:
//判断在字符串s中,是否按顺序存在目标字符串的所有字母
bool ifExist( string s, string sub)
{
if(s.size() < sub.size()) return false;
int temp = 0;
vector<string> cur;
for(int i = 0;i<sub.size();i++)
{
int cur = temp;
for(int j = temp;j<s.size();j++)
{
if(s[j] == sub[i])
{
temp = j+1;
break;
}
}
if(cur == temp){
return false;
}
}
return true;
}
string findLongestWord(string s, vector<string>& dictionary) {
//对dictionary中的每一个字符串,拿到字符串s中遍历,若每个字母在s中都能找到,则返回该字符串
vector<int> v;
string max ="" ;
for(int i = 0;i<dictionary.size();i++)
{
if(ifExist(s,dictionary[i])){
v.push_back(i);
}
}
if(v.empty()){
return "";
}
for(int j = 0;j<v.size();j++)
{
int k = v[j];
//if(max.size()<dictionary[k].size() || max.size() == dictionary[k].size()&& max > dictionary[k] ) 改成这样就对咯
if(max.size()<dictionary[k].size()){
max = dictionary[k];
}
}
return max;
}
};
只能返回最长的,做不到返回字典序最小的
wocao,字典序就是字符串最小的,在判断语句改成if(max.size()<dictionary[k].size() || max.size() == dictionary[k].size()&& max > dictionary[k] )这样就可以了
贴一段别人的代码
class Solution {
private:
// src是否包含dst这个子序列
bool IsSubsequence(string src, string dst)
{
int ns = src.size();
int nt = dst.size();
int i = 0;
int j = 0;
// 顺序遍历src,找出dst中的字母
for (; i < ns && j < nt; ++i)
{ //若找到了,则在src剩下的字符串中寻找dst中下一位字母
if (src[i] == dst[j])
{
++j;
}
}
//若src包含dst,则循环结束时 j==nt
return j == nt;
}
public:
string findLongestWord(string s, vector<string>& dictionary) {
// 保存最大的结果
string res = "";
for (string dst : dictionary)
{
if (IsSubsequence(s, dst))
{
// 找到更长的 或者 一样长但是字典序更小
if ((dst.size() > res.size()) || (dst.size() == res.size() && dst < res))
{
res = dst;
}
}
}
return res;
}
};
感觉自己就是个沙雕,简单的问题写的这么麻烦,我丢,字典序最小不就是字符串最小嘛?