题目:给定一个字符串和一个字符串字典,找到字典里面最长的字符串,该字符串可以通过删除给定字符串的某些字符来得到。如果答案不止一个,返回长度最长且字典顺序最小的字符串。如果答案不存在,则返回空字符串。
示例 1:
输入:
s = “abpcplea”, d = [“ale”,“apple”,“monkey”,“plea”]
输出:
“apple”
示例 2:
输入:
s = “abpcplea”, d = [“a”,“b”,“c”]
输出:
“a”
说明:
所有输入的字符串只包含小写字母。
字典的大小不会超过 1000。
所有输入的字符串长度不会超过 1000
题解:遍历List,使得每个元素都跟s字符串同时遍历,并用count值记录s对每个元素的字符个数,如果每个元素指针能走到最后则说明s字符串通过删除字母能匹配到该元素,将该元素和count添加到map中,遍历map找出count值最大的key,比较过程中不断比较key值对应的count和max之间的大小,如果count大,则替换max,替换key值,如果count和max相等,则使用compareTo()方法比较出字典序较小的key值,最终返回匹配值最长的单词。
package com.ljq.doublepoint;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;
/**
* @author 作者 Your-Name:
* @version 创建时间:2019年8月26日 下午7:47:53
* 类说明
*/
public class MatchWord {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Scanner scanner = new Scanner(System.in);
while(scanner.hasNext()) {
String[] strings = scanner.nextLine().split(" ");
String s = strings[0];
int len = strings.length;
List<String> d = new ArrayList<String>();
for(int i=1;i<len;i++) {
d.add(strings[i]);
}
String ret = findLongestWord(s,d);
System.out.println(ret);
}
scanner.close();
}
// "barfoofoobarthefoobarman"
// ["bar","foo","the"]
public static String findLongestWord(String s,List<String> d) {
String ret = "";
int len_l = d.size();
int len_s = s.length();
HashMap<String, Integer> map = new HashMap<String, Integer>();
// 外层循环控制次数
for(int k=0;k<len_l;k++) {
int len_sub = d.get(k).length();
int i=0,j=0;
int count = 0;
while(i<len_s&&j<len_sub) {
if(s.charAt(i)==d.get(k).charAt(j)) {
count++;
i++;
j++;
}else {
i++;
}
}
if(j==len_sub) {
map.put(d.get(k), count);
}
}
// List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String,Integer>>(map.entrySet());
//
// Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
//
// @Override
// public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
// // TODO 自动生成的方法存根
// return o2.getKey().compareTo(o1.getKey());
// }
// });
int max = Integer.MIN_VALUE;
Set<String> keys = map.keySet();
for(String key:keys) {
if(map.get(key)>max) {
max = map.get(key);
ret = key;
}else if(map.get(key)==max) {
ret = key.compareTo(ret)<0?key:ret;
}
}
return ret;
}
}