力扣刷题百天计划 Day13 通过删除字母匹配到字典里最长单词 力扣题库第524题 C# 双指针 中等难度

学习目标:

我会持续更新我独特的算法思路,希望能给大家带来不一样的思维拓展!
如果大家感觉有帮助的话,欢迎点赞关注支持哦!
你们的鼓励是我坚持下去的动力!
!!!

力扣题库第524题 官方链接

学习内容:

通过删除字母匹配到字典里最长单词

给你一个字符串 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] 仅由小写英文字母组成

学习时间:

2022.1.24


学习产出:

思路一

双指针
在这里插入图片描述

解题思路

  1. 我们要在字典里面找到最长的单词,则需要遍历我们的字典
  2. 在遍历字典的时候,我们拿到当前的字符串。我们与最长单词做比较,如果该字符串比最大字符串要短,则直接continue,因为我们要找的是最长的
  3. 如果该字符串和最大字符串一样长 则比较字母序列 如果该字符串字母序列比较大的话,则直接continue,因为我们找的是字母序列小的
  4. 比较完之后,我们就要判断这个字符串是不是可以通过删除s的某些字符来组成
  5. 核心思想来了,我们怎么去判断这个字符串是不是可以通过删除s的某些字符来组成呢?我们利用双指针,一个指向s串的第一个字符,名为l1,一个指向Target字符串的第一个字符名为l2
  6. 我们判断两个字符是否相等,如果相等则让l1和l2同时加一,即指向下一个字符。如果不相等,则让l1加一,相当于删除了s串的当前字符,然后指向了下一个字符
  7. 当我们遍历完s的全部或者Target字符串的全部,则判断当前l2是不是到了Target的后一位,即,l2是否等于Target字符串的长度。是不是Target字符串都存在s里面
  8. 我们遍历完Dictionary里面的字符串之后,我们就可以得到最长单词
    在这里插入图片描述
public class Solution {
    
    
    public string FindLongestWord(string s, IList<string> dictionary) {
    
    
        string TargetString="";
        int l1=0;
        int l2=0;
        for(int i=0;i<dictionary.Count;i++){
    
    
            l1=TargetString.Length;
            l2=dictionary[i].Length;
            //如果该字符串比最大字符串要短,则直接continue,因为我们要找的是最长的
            //如果该字符串和最大字符串一样长  则比较字母序列 如果该字符串字母序列比较大的话,则直接continue,因为我们找的是字母序列小的
            if(l1>l2||(l1==l2&&isRbiggerL(TargetString,dictionary[i]))){
    
     
                continue;
            }

            if(isSubstr(s,dictionary[i])){
    
    
                //如果是子串
                TargetString=dictionary[i];
            }
        }
        return TargetString;
    }

    bool isSubstr(string s,string target){
    
    
        int l1=0;
        int l2=0;
        while(l1<s.Length&&l2<target.Length){
    
    
            if(s[l1]==target[l2]){
    
    
                l2++;
            }
            l1++;
        }
        return l2==target.Length;
    }

    bool isRbiggerL(string L,string R){
    
    
        for(int i=0;i<R.Length;i++){
    
    
            if(L[i]==R[i])continue;
            if(L[i]>R[i])return false;
            else return true;
        }
        return false;
    }
}

作者:荷兰猪小灰灰
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

猜你喜欢

转载自blog.csdn.net/m0_48781656/article/details/122672169