题目:

给你一个字符串 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的起始位置,如果

s.charAt(i) == s1.charAt(j) ,则两个指针都向后移一位,否则,就仅让 指向 s 的指针 i 后移,继续判断;
3.最终,如果 j == 当前s1的长度,说明该字符串匹配成功,不需要再进行后续匹配,直接返回即可,如果整个遍历匹配都不成功,直接返回空字符串 ""。
代码:

二、动态规划

1.先使用动态规划对 s 中的字符位置进行预处理,设s的字符串长度为n,建立一个 n+1*26 大小的矩阵,初始化二维数组的最后一行dp[n][i] 都为n,从后往前填充数组,其他每个位置上的值代表s中每个字符第一次出现的位置;

2.设定一个标志位表示是否匹配成功,初始值为true,遍历字符数组dictionary中每个字符串的每个字符,如果当前值为初始化值n,表示不匹配,

如果查找到,,则从字符串s的下一位继续匹配;
3.如果最终有多个值匹配,则选择dictionary中最长的字符串,如果存在两个匹配的字符串相等,则选择字母序列最小的返回即可。
 
代码:
 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)-通过删除字母匹配到字典里最长单词(中等)的更多相关文章

  1. Java实现 LeetCode 524 通过删除字母匹配到字典里最长单词(又是一道语文题)

    524. 通过删除字母匹配到字典里最长单词 给定一个字符串和一个字符串字典,找到字典里面最长的字符串,该字符串可以通过删除给定字符串的某些字符来得到.如果答案不止一个,返回长度最长且字典顺序最小的字符 ...

  2. 524. 通过删除字母匹配到字典里最长单词 (Medium)

    问题描述 524. 通过删除字母匹配到字典里最长单词 (Medium) 给你一个字符串 s 和一个字符串数组 dictionary ,找出并返回 dictionary 中最长的字符串,该字符串可以通过 ...

  3. leetcode.双指针.524通过删除字母匹配到字典里最长单词-Java

    1. 具体题目 给定一个字符串和一个字符串字典,找到字典里面最长的字符串,该字符串可以通过删除给定字符串的某些字符来得到.如果答案不止一个,返回长度最长且字典顺序最小的字符串.如果答案不存在,则返回空 ...

  4. [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 ...

  5. 【LeetCode】524-通过删除字母匹配到字典里最长单词

    题目描述 给定一个字符串和一个字符串字典,找到字典里面最长的字符串,该字符串可以通过删除给定字符串的某些字符来得到.如果答案不止一个,返回长度最长且字典顺序最小的字符串.如果答案不存在,则返回空字符串 ...

  6. leetcode 524. Longest Word in Dictionary through Deleting 通过删除字母匹配到字典里最长单词

    一.题目大意 https://leetcode.cn/problems/longest-word-in-dictionary-through-deleting 给你一个字符串 s 和一个字符串数组 d ...

  7. 力扣(LeetCode)删除排序链表中的重复元素II 个人题解

    给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 思路和上一题类似(参考 力扣(LeetCode)删除排序链表中的重复元素 个人题解)) 只不过这里需要用到一个前 ...

  8. 力扣——remove element(删除元素) python实现

    题目描述: 中文: 给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) ...

  9. 力扣(LeetCode)删除排序链表中的重复元素 个人题解

    给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 这题思路比较简单,同样是快慢针的思路. 用一个整数类型val对应最新的只出现过一次的那个值, 如果节点的下一个节点的值和这个对应则不做别 ...

  10. 力扣—Remove Nth Node From End of List(删除链表的倒数第N个节点) python实现

    题目描述: 中文: 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二 ...

随机推荐

  1. archlinux 使用ventoyU盘启动器(ISO)

    ventoy详细介绍https://www.ventoy.net/cn/doc_start.html Linux系统安装 Ventoy -- 命令行界面 下载安装包,例如 ventoy-1.0.00- ...

  2. 32位数字电位器AD5228使用及调试总结

    一 概念 什么是数字电位计? 数字电位器(Digital Potentiometer)亦称数控可编程电阻器,是一种代替传统机械电位器(模拟电位器)的新型CMOS数字.模拟混合信号处理的集成电路.数字电 ...

  3. 适合新手练习的python开源经典源码

    一 前记 python学习离不开三要素: A.基础知识要熟悉 B. 练习源码要够量 C.实战项目要跟上 二 链接 书本的基础就看几本书就可以了,这里给出源码练习的经典开源源码: 该链接集合了pytho ...

  4. 谈谈Android中的消息提示那些坑

    Android中的消息提示无非就那几种,弹个窗(Toast或SnackBar),或者是弹出个对话框(Dialog),最近在使用的时候也是遇到了问题,有时候导致APP闪退 稍微研究会,总结了一下使用过程 ...

  5. JavaScript自定义响应式对象

    1. 引言 这里的响应式对象是指JavaScript中的变量与HTML中的内容相绑定,变量更新则内容更新,也叫数据绑定 此时不得不说MVVM架构,MVVM架构思想的实现步骤如下: 模型(Model): ...

  6. Spring Boot框架中针对数据文件模板的下载总结

    1.前言 在我们的日常开发中,经常会碰到注入导入Excel数据到系统中的需求,而在导入Excel数据时,一般的业务系统都会提供数据的Excel模板,只有提交的Excel数据满足业务系统要求的模板时,数 ...

  7. cyc_to_led

    Entity: cyc_to_led File: cyc_to_led.v Diagram Generics Generic name Type Value Description MD_SIM_AB ...

  8. KingbaseES 行级安全策略介绍

    本文详细介绍了KingbaseES中通过CREATE POLICY为一个表定义一条行级安全性策略.注意为了应用已被创建的策略,在表上必须启用行级安全性. 策略名称是针对每个表的.因此,一个策略名称可以 ...

  9. KingbaseES 名词解释之timeline

    timeline定义 每当归档文件恢复完成后,创建一个新的时间线用来区别新生成的WAL记录.WAL文件名由时间线和日志序号组成 引入timeline的意义 为了理解引入时间线的背景,我们来分析一下,如 ...

  10. .NET分布式Orleans - 8 - 贪吃蛇项目实战(准备阶段)

    到目前为止,Orleans7的核心概念基本已经学完,我准备使用Orleans7做一个项目实战,来总结自己的学习效果. 项目效果 通过Orleans7来完成一个贪吃蛇游戏,要求如下: 可以多人在线玩 贪 ...