通过删除字母匹配到字典里最长单词
Posted ych9527
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过删除字母匹配到字典里最长单词相关的知识,希望对你有一定的参考价值。
通过删除字母匹配到字典里最长单词
- 题意:字典是一个string数组,从数组中寻找元素与s的子串进行匹配,要求匹配的字符串尽可能的长,当匹配的字符串长度相等时,选择字典序小的
- 题解:
- 将string数组进行排序,按照长度排升序,按照字典序排降序
- 从前往后进行匹配,越匹配后面的越符合要求,因为后面的长度越长,字典序越小
- 匹配方法,给定两个指针,一个指针begin1指向s,一个指针begin2指向数组的元素,当begin2指向的位置超过当前元素,表示全部匹配
class Solution {
public:
//短的,字典序大的在前面
struct Less
{
bool operator()(string &s1,string &s2)
{
//s1比s2短,排在s2前面
if(s1.size()<s2.size())
return true;
//s1比s2长
else if(s1.size()>s2.size())
return false;
//一样长,字典序大的在前面
for(int i=0;i<s2.size();i++)
{
if(s1[i]>s2[i])
return true;
else if(s1[i]<s2[i])
return false;
else
continue;
}
return false;
}
};
string findLongestWord(string s, vector<string>& dictionary) {
//题意:s删除某些字符,得到字典中的最长字符串
//给定两个指针,一个指向s,一个指向字典
//先将字典内的字符按照规则排序 -> 长度升序,字典序升序
string ret;
sort(dictionary.begin(),dictionary.end(),Less());
for(int i=0;i<dictionary.size();i++)
{
int begin1=0;
int begin2=0;
while(begin1<s.size() && begin2<dictionary[i].size())
{
if(s[begin1]==dictionary[i][begin2])
{
begin1++;
begin2++;
}
else//当前不匹配
begin1++;
}
//后面的指针走完了,表示当前匹配,更新字符串
if (begin2==dictionary[i].size())
ret=dictionary[i];
}
return ret;
}
};
以上是关于通过删除字母匹配到字典里最长单词的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode——通过删除字母匹配到字典里最长单词(子序列)
[M贪心] lc524. 通过删除字母匹配到字典里最长单词(排序+判断子序列)