问题描述:
给你一个字符串 s 和一个字符串数组 dictionary ,找出并返回 dictionary 中最长的字符串,该字符串可以通过删除 s 中的某些字符得到。
如果答案不止一个,返回长度最长且字母序最小的字符串。如果答案不存在,则返回空字符串。
示例1:
输入:s = "abpcplea", dictionary = ["ale","apple","monkey","plea"] 输出:"apple"
示例2:
输入:s = "abpcplea", dictionary = ["a","b","c"] 输出:"a"
解题思路:分析问题,题目要求找出并返回dictionary中最长的字符串,该字符串可以通过删除s中的某些字符得到。答案可能不止一个,但是返回最长的那个字符串。
题目要求返回最长的符合要求的字符串,则我们可以对dictionary中的字符串按长度进行降序排序。又符合要求的字符串是通过s删除某些字符得到的,则s中出现的符合要求的字符串中的字符一定是按顺序出现在字符串s中的。
故我们可以这样做:使用两组首尾指针,start与end指向字符串s的首尾两端,n与m指向dictionary中字符串chars的首尾两端。两组首尾指针的运动方向都是相向而行的。我们通过字符不断的进行两个字符串的首尾两端比较,寻找字符串s中能否找到匹配字符串chars的全部字符。代码如下:
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
//给你一个字符串 s 和一个字符串数组 dictionary ,找出并返回 dictionary 中最长的字符串,该字符串可以通过删除 s
//中的某些字符得到。如果答案不止一个,返回长度最长且字母序最小的字符串。如果答案不存在,则返回空字符串。
public class Leetcode_524 {
public String findLongestWord(String s, List<String> dictionary) {
//将字符数组按长度降序排序
dictionary.sort(new Comparator<String>() {
public int compare(String o1, String o2) {
if (o1.length() == o2.length()){
return o1.compareTo(o2);
}else{
if (o1.length() > o2.length()){
return -1;
}else{
return 1;
}
}
}
});
for (int i = 0; i < dictionary.size(); i++) {
String chars = dictionary.get(i);
int size = chars.length();
int n=0,m=size-1;
int start = 0, end = s.length()-1;
while(start<=end && n<=m){
if(end-start+1 >= size){
if (s.charAt(start)==chars.charAt(n)){
n++;
size = m-n+1;
}
if (s.charAt(end)==chars.charAt(m)){
m--;
size = m-n+1;
}
start++;end--;
}
else break;
}
if (size ==0 || size == -1){
return chars;
}
}
return "";
}
public static void main(String[] args){
List<String> dictiona = new ArrayList<String>();
dictiona.add("ale");
dictiona.add("apple");
dictiona.add("monkey");
dictiona.add("plea");
String s = "abpcplea";
Leetcode_524 l = new Leetcode_524();
String anw = l.findLongestWord(s,dictiona);
System.out.println(anw);
}
}