通过删除字母匹配到字典里最长单词 leetcode 524
给你一个字符串 s 和一个字符串数组 dictionary 作为字典,找出并返回字典中最长的字符串,该字符串可以通过删除 s 中的某些字符得到。
如果答案不止一个,返回长度最长且字典序最小的字符串。如果答案不存在,则返回空字符串。
示例 1:
输入:s = "abpcplea", dictionary = ["ale","apple","monkey","plea"]
输出:"apple"
示例 2:
输入:s = "abpcplea", dictionary = ["a","b","c"]
输出:"a"
双指针
思路
1.字符串是否含有dictionary
2.匹配长度最长且下标最小的字符串
s逐一检测是否含有dictionary的序列:当s和dictionary中字符串t元素相同即s[i]==t[j]时j++;否则只右移s的指针i。如果s完全包含t是在遍历结束时j == t.size()
此时比较该字符串是否符合第二个要求.
代码
class Solution {
public:
string findLongestWord(string s, vector<string>& dictionary) {
string res;
for (string item : dictionary)
{
int pS = 0, pI = 0, sSize = s.size(), iSize = item.size();
while (pS < sSize && pI < iSize)
{
if (s[pS] == item[pI])
{
++pI;
}
++pS;
}
if ( pI == iSize &&
(res.size() < item.size() ||
(res.size() == item.size() && item.compare(res)<0)))
{
res = item;
}
}
return res;
}
};
动态规划
gan
思路
代码
string findLongestWord(string s, vector<string>& dictionary) {
string res;
int n = s.size();
vector<int> address(26, n);
//状态方程留出addressList[n]
vector<vector<int>> addressList(n + 1, address);
for (int i = n - 1; i >= 0; --i)
{
for (int j = 0; j < 26; ++j)
{
if (s[i] - 'a' == j)
{
addressList[i][j] = i;
}
else
{
addressList[i][j] = addressList[i+1][j];
}
}
}
for (string item : dictionary)
{
int pI = 0, pS = 0;
while(pI < item.size())
{
if(addressList[pS][item[pI] - 'a'] == n)
{
break;
}
pS = addressList[pS][item[pI] - 'a'] + 1;
++pI;
}
if (pI == item.size() && (res.size() < item.size() || (res.size() == item.size() && item.compare(res) < 0)))
{
res = item;
}
}
return res;
}