题目来源:https://leetcode-cn.com/problems/longest-word-in-dictionary-through-deleting/
大致题意:
给出一个字符串 s,和一个字符串数组,求出 s 的子串能组成的字符串数组元素中的最长的字符串
思路
刚来时想成了最长公共子序列,但是显然不对。且不说球最长公共子序列复杂度更高,题目要求是 s 的子串需要构成字符串数组的某个元素。
那么就只需要双指针遍历,一个指针遍历 s,一个遍历当前的字符串数组元素,只有当当前两个指针指向的字符相等时,数组元素指针才向后移动一步。若后者指针可以遍历到数组元素的所有字符,即代表 s 的子串可以组成当前数组元素。
双指针
- 遍历字符串数组
- 若当前字符串可以由 s 的子串表示,比较当前串的长度,若 大于等于 已存的最长串,则做更新处理
代码:
public String findLongestWord(String s, List<String> dictionary) {
String ansStr = "";
int maxLen = 0;
for (int i = 0; i < dictionary.toArray().length; i++) {
String str = dictionary.get(i);
// str 可以由 s 的子串表示
if (findCommon(s, str)) {
// str 长度大于已存的最长长度
if (str.length() > maxLen) {
maxLen = str.length();
ansStr = str;
}
// str 长度等于已存的最长长度
else if (str.length() == maxLen) {
// 返回字典序更小的串
ansStr = ansStr.compareTo(str) > 0 ? str : ansStr;
}
}
}
return ansStr;
}
// 双指针遍历字串
public boolean findCommon(String s1, String s2) {
int n = s1.length();
int m = s2.length();
int idx = 0;
if (n < m) {
return false;
}
for (int i = 0; i < n; i++) {
if (s1.charAt(i) == s2.charAt(idx)) {
idx++;
}
if (idx == m) {
break;
}
}
return idx == m ? true : false;
}