力扣524(java)-通过删除字母匹配到字典里最长单词(中等)
题目:
给你一个字符串 s 和一个字符串数组 dictionary ,找出并返回 dictionary 中最长的字符串,该字符串可以通过删除 s 中的某些字符得到。
如果答案不止一个,返回长度最长且字母序最小的字符串。如果答案不存在,则返回空字符串。
示例 1:
输入:s = "abpcplea", dictionary = ["ale","apple","monkey","plea"]
输出:"apple"
示例 2:
输入:s = "abpcplea", dictionary = ["a","b","c"]
输出:"a"
提示:
1 <= s.length <= 1000
1 <= dictionary.length <= 1000
1 <= dictionary[i].length <= 1000
s 和 dictionary[i] 仅由小写英文字母组成
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/longest-word-in-dictionary-through-deleting
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
一、排序+双指针
1.首先将字符串数组dictionary中的每个字符串进行排序,如果字符串长度不相等,则按照长度降序排序,如果字符串相等,则按字符升序排序;
2.遍历排好序后的dictionary中每个字符串,定义两个指针 i 和 j ,分别指向字符串 s 和 dictionary中每个字符串 s1的起始位置,如果

二、动态规划
1.先使用动态规划对 s 中的字符位置进行预处理,设s的字符串长度为n,建立一个 n+1*26 大小的矩阵,初始化二维数组的最后一行dp[n][i] 都为n,从后往前填充数组,其他每个位置上的值代表s中每个字符第一次出现的位置;
2.设定一个标志位表示是否匹配成功,初始值为true,遍历字符数组dictionary中每个字符串的每个字符,如果当前值为初始化值n,表示不匹配,
1 class Solution {
2 public String findLongestWord(String s, List<String> dictionary) {
3 int n = s.length();
4 int[][] dp = new int[n+1][26];
5 //初始化二维数组最后一行
6 for(int i = 0; i < 26; i++){
7 dp[n][i] = n;
8 }
9 //动态填充二维数组,从后往前遍历
10 for(int i = n-1; i >= 0; i--){
11 for(int j = 0; j < 26; j++){
12 //如果当前字符与26字母中的一个相同,则当前行号就为当前位置的值
13 if(s.charAt(i) == (char)(j + 'a')){
14 dp[i][j] = i;
15 }else{
16 //如果不同,则将下一行的值给当前行
17 dp[i][j] = dp[i + 1][j];
18 }
19 }
20 }
21 String res = "";
22 //开始匹配
23 for(String d1 : dictionary){
24 //设定一个标志位表示是否匹配成功,初始值为匹配
25 boolean match = true;
26 int j = 0;
27 //遍历字符数组中每个字符串的每个字符
28 for(int i = 0; i < d1.length(); i++){
29 //如果当前值为初始化值,表示不匹配
30 if(dp[j][d1.charAt(i) - 'a'] == n){
31 match = false;
32 break;
33 }
34 //如果查找到,,则从s的下一位继续匹配
35 j = dp[j][d1.charAt(i) - 'a'] + 1;
36 }
37 if(match){
38 //在匹配的条件下,如果长度大或者在长度相等的情况下选择字母序小的,
39 if(d1.length() > res.length() || (d1.length() == res.length() && d1.compareTo(res) < 0)){
40 res = d1;
41 }
42 }
43 }
44 return res;
45
46 }
47 }

小知识:
1.以下两种写法是一个意思,都是将字符数组中长度不等的每个字符串进行升序排序,长度相等的按字母顺序降序排序。
Collections.sort(list, new Comparator<>()):
第一个参数:需要排序的list
第二个参数:比较器,实现Comparator接口的类,返回一个int型的值,就相当于一个标志,告诉sort方法按什么顺序来对list进行排序。Comparator是个接口,可重写compare()及equals()这两个方法,用于比较功能。
- compare(a,b)方法:根据第一个参数小于、等于或大于第二个参数分别返回负整数(升序)、零(不变)或正整数(降序)。
升序: list.sort((a,b)->a-b); 或者 list.sort((a,b)->a.compareTo(b));
降序:list.sort((a,b)->b-a); 或者 list.sort((a,b)->b.compareTo(a));
- equals(obj)方法:仅当指定的对象也是一个 Comparator,并且强行实施与此 Comparator 相同的排序时才返回 true。
a.compareTo(b) 来“比较a和b的大小”,方便记忆为"x-y"。若返回“负数”,意味着“a比b小”;返回“零”,意味着“a等于b”;返回“正数”,意味着“a大于b”。
- *升序排的话就是第一个参数.compareTo(第二个参数);
*降序排的话就是第二个参数.compareTo(第一个参数);
// 1.
Collections.sort(dictionary, new Comparator<String>() {
public int compare(String a, String b) {
if (a.length() != b.length()) {
return b.length() - a.length();
} else {
return a.compareTo(b);
}
}
});
//2.
Collections.sort(dictionary, (a,b)->{
if(a.length() != b.length())
return b.length() - a.length();
return a.compareTo(b);
});
2.空字符串("")和 null 和 空格字符串(" ")的区别:
1 string str1 = ""; //空字符串,分配了内存,分配了一个空间 str1.length() 等于 0
2 string str2 = null; //NULL
3 string str3 = " "; //空格串,分配了内存,分配了一个空间 str2.length() 等于 1
力扣524(java)-通过删除字母匹配到字典里最长单词(中等)的更多相关文章
- Java实现 LeetCode 524 通过删除字母匹配到字典里最长单词(又是一道语文题)
524. 通过删除字母匹配到字典里最长单词 给定一个字符串和一个字符串字典,找到字典里面最长的字符串,该字符串可以通过删除给定字符串的某些字符来得到.如果答案不止一个,返回长度最长且字典顺序最小的字符 ...
- 524. 通过删除字母匹配到字典里最长单词 (Medium)
问题描述 524. 通过删除字母匹配到字典里最长单词 (Medium) 给你一个字符串 s 和一个字符串数组 dictionary ,找出并返回 dictionary 中最长的字符串,该字符串可以通过 ...
- leetcode.双指针.524通过删除字母匹配到字典里最长单词-Java
1. 具体题目 给定一个字符串和一个字符串字典,找到字典里面最长的字符串,该字符串可以通过删除给定字符串的某些字符来得到.如果答案不止一个,返回长度最长且字典顺序最小的字符串.如果答案不存在,则返回空 ...
- [Swift]LeetCode524. 通过删除字母匹配到字典里最长单词 | Longest Word in Dictionary through Deleting
Given a string and a string dictionary, find the longest string in the dictionary that can be formed ...
- 【LeetCode】524-通过删除字母匹配到字典里最长单词
题目描述 给定一个字符串和一个字符串字典,找到字典里面最长的字符串,该字符串可以通过删除给定字符串的某些字符来得到.如果答案不止一个,返回长度最长且字典顺序最小的字符串.如果答案不存在,则返回空字符串 ...
- leetcode 524. Longest Word in Dictionary through Deleting 通过删除字母匹配到字典里最长单词
一.题目大意 https://leetcode.cn/problems/longest-word-in-dictionary-through-deleting 给你一个字符串 s 和一个字符串数组 d ...
- 力扣(LeetCode)删除排序链表中的重复元素II 个人题解
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 思路和上一题类似(参考 力扣(LeetCode)删除排序链表中的重复元素 个人题解)) 只不过这里需要用到一个前 ...
- 力扣——remove element(删除元素) python实现
题目描述: 中文: 给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) ...
- 力扣(LeetCode)删除排序链表中的重复元素 个人题解
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 这题思路比较简单,同样是快慢针的思路. 用一个整数类型val对应最新的只出现过一次的那个值, 如果节点的下一个节点的值和这个对应则不做别 ...
- 力扣—Remove Nth Node From End of List(删除链表的倒数第N个节点) python实现
题目描述: 中文: 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二 ...
随机推荐
- 3D渲染慢,直接买显卡还是用云渲染更划算?
3D渲染对建筑师和设计师来说并不陌生,3D渲染的过程中出现渲染卡顿.特殊材质难以渲染,或者本地配置不足.本地渲染资源不够时,常常会影响工作效率.本文比较了3D渲染时,为提高工作效率,买显卡还是用云渲染 ...
- 实时云渲染 VS 本地渲染,全面横向对比
不少用户不能理解,为什么要选用实时云渲染,而不用本地的电脑进行渲染显示?本文将通过各个方面来对比两种模式的优劣支持,帮助您更全面了解实时云渲染和本地渲染. 一.便携性对比 由于GPU对机箱空间有要求, ...
- 专访OV季军|毕业转为freelancer,他如何斩获大量CG奖项?
"新锐先锋,玩转未来"--首届实时渲染3D动画创作大赛由瑞云科技主办,英伟达.青椒云.3DCAT实时渲染云协办,戴尔科技集团.Reallusion.英迈.万生华态.D5渲染器.中视 ...
- HTML(html结构、标签导读 、路径))
HTML第一天 我们接下来是进行的网页开发网页的相关概念: 什么是网页? 什么是HTML? 网页的形成? 一 什么是网页: 1.网站是指在因特网上根据一定的规则,使用 HTML 等制作的用于展示特定内 ...
- python基础十(常用模块)
一 time与datetime模块 1.time import time # 时间分为三种格式: # 1.时间戳:从1970年到现在经过的秒数 # 作用:用于时间间隔的计算 print(time.ti ...
- 洞元智维产品上线:江浙沪PV访问量飙升背后的深层逻辑与未来发展趋势
洞元智维产品自上线以来,凭借其卓越的智能化产品性能和出色的用户体验,迅速在市场上崭露头角,特别是在上海.江苏.浙江等经济发达地区,其PV访问量持续飙升.这不仅反映了用户对智能化产品的强烈需求,更揭示了 ...
- ts-对象数组reduce-数组转对象数组
将字符串数组转化成{name:xxx,count:xxx}[]数组的代码 #定义数据类型 interface CartInfo{ name:string, count:number } let raw ...
- KingbaseES V8R6 运维案例 --flashback drop table
一.KingbaseES V8R6 flashback drop table介绍 使用FLASHBACK删除和恢复表 删除表时,数据库不会立即删除与该表关联的空间.数据库重命名表,并将其和任何关联的对 ...
- Java封装xml格式参数请求第三方接口
Java封装xml格式参数请求第三方接口 1.引用包 import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers ...
- #轮廓线dp,博弈论#洛谷 4363 [九省联考 2018] 一双木棋 chess
题目传送门 分析 菲菲想让答案尽量大,牛牛想让答案尽量小. 很天真的一种想法就是设 \(dp[i][j]\) 表示现在选择 \((i,j)\) 的答案. 但是这样有一个弊端就是并不知道其它位置怎么选择 ...