Likouブラッシング質問百日計画Day13文字を削除して、辞書の最長の単語と一致させますLikou質問バンクNo. 524 C#ダブルポインター中難易度

学習目標:

私はあなたに異なる思考の拡張をもたらすことを望んで、私のユニークなアルゴリズムのアイデアを更新し続けます!
役に立ったら、いいね、フォロー、サポートしてください!
あなたの励ましは私を動かし続けるものです!

歴口質問銀行質問524公式リンク

学習コンテンツ:

文字を削除して、辞書の最長の単語と一致させます

给你一个字符串 s 和一个字符串数组 dictionary ,找出并返回 dictionary 中最长的字符串,该字符串可以通过删除 s 中的某些字符得到。

如果答案不止一个,返回长度最长且字母序最小的字符串。如果答案不存在,则返回空字符串。

例1:

入力:s = "abpcplea"、dictionary = ["ale"、 "apple"、 "monkey"、 "plea"]
出力: "apple"
例2:

入力:s = "abpcplea"、辞書= ["a"、 "b"、 "c"]
出力: "a"

提示:

1 <= s.length <= 1000
1 <= dictionary.length <= 1000
1 <= dictionary[i].length <= 1000
s 和 dictionary[i] 仅由小写英文字母组成

勉強の時間:

2022.1.24


学習出力:

アイデア1

ダブルポインタ
ここに画像の説明を挿入

問題解決のアイデア

  1. 辞書で最も長い単語を見つけるには、辞書をトラバースする必要があります
  2. 辞書をトラバースしている間、現在の文字列を取得します。最長の単語と比較します。文字列が最大の文字列よりも短い場合は、最長の単語を探しているため、直接続行します。
  3. 文字列が最大の文字列と同じ長さの場合は、文字のシーケンスを比較します。文字列内の文字のシーケンスが大きい場合は、小さい文字のシーケンスを探しているため、直接続行します。
  4. 比較後、sの一部の文字を削除して文字列を形成できるかどうかを判断する必要があります
  5. 核となるアイデアはここにあります。sの一部の文字を削除することでこの文字列を形成できるかどうかをどのように判断しますか?1つはl1という名前のs文字列の最初の文字への、もう1つはl2という名前のターゲット文字列の最初の文字への二重ポインタを使用します。
  6. 2つの文字が等しいかどうかを判断します。等しい場合は、l1とl2を同時に1つ増やします。つまり、次の文字を指します。それらが等しくない場合は、l1に1を追加します。これは、s文字列の現在の文字を削除してから、次の文字を指すことと同じです。
  7. すべてのsまたはすべてのターゲット文字列をトラバースすると、現在のl2がターゲットの最後の桁に到達したかどうか、つまり、l2がターゲット文字列の長さに等しいかどうかが判断されます。ターゲット文字列はsに存在しますか?
  8. 辞書の文字列をトラバースした後、最長の単語を取得できます
    ここに画像の説明を挿入
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;
    }
}

著者:モルモットXiaohuihui
著作権は著者に帰属します。商用の再版については、著者に連絡して許可を求め、非商用の再版については、出典を示してください。

おすすめ

転載: blog.csdn.net/m0_48781656/article/details/122672169