[Leet Code] Longest String Chain
こんにちは!
今日、5月の3週目に3番目のアルゴリズムLongest String Chainプールを作成します.
サマリ
与えられた
まず、
じゃ、逆に探しましょう.
これは問題であり、
論理について詳しく説明しましょう.
これにより、
そして、
すべての
チェック時に
すべての可能な鎖長
原因は
昨日、今日は
昨日
今回の位置付けを読んでいただき、フィードバックエラーを歓迎します:)
今日、5月の3週目に3番目のアルゴリズムLongest String Chainプールを作成します.
質問する
サマリ
与えられた
words
では、文字列間に関連するchain
関係を見つけ、最も長いchain
を返す.初志
まず、
words
を長さ順に並べ、次に最短のString
から順に、次のString
の中にString
が現在含まれているかどうかをチェックし、最大のcount
を返します."bdca".contains("bda")
はfalse
を導出したので,論理的誤りを感じた.第二の考え方
じゃ、逆に探しましょう.
words
を長さ降順に並べ、String
を逐字削除して配列に含まれるかどうかを判断します.これは問題であり、
chain
から1つの語に至るため、dfs
方式が適用される.論理について詳しく説明しましょう.
コードの説明
int maxChain = 0;
Set<String> wordSet = new HashSet<>();
Map<String, Integer> wordChainMap = new HashMap<>();
maxChain
は、最長チェーン長を格納する変数である.words
配列の単語をwordSet
に保存し、chain
のwordChainMap
まで保存できることを宣言します.for (String word: words) {
wordSet.add(word);
}
wordSet
に単語を格納します.for (String word: words) {
maxChain = Math.max(maxChain, dfs(wordChainMap, wordSet, word));
}
単語chain
を1つずつ解きます.ここではdfs
関数が表示されます.dfs
関数の値とmaxChain
の値を比較し、より大きな値をmaxChain
に格納します.dfs
関数private int dfs(Map<String, Integer> map, Set<String> set, String word) {
if (map.containsKey(word)) return map.get(word);
int count = 0;
for (int i = 0; i < word.length(); i++) {
String compareWord = word.substring(0, i) + word.substring(i + 1);
if (set.contains(compareWord)) count = Math.max(count, dfs(map, set, compareWord));
}
map.put(word, count + 1);
return count + 1;
}
この語が既にmap
に存在する場合、その語のchain
長さmap.get(word)
が返される.これにより、
dfs
論理の時間が大幅に減少します.検査済みのword
のchain
を繰り返し検査する必要はないからです.map
に単語が存在しない場合、chain
を初期化してcount
の長さを取得する.そして、
word
の長さでforゲートの巡回を行い、word
から逐字除外してcompareWord
を作成する.すべての
word
がset
に格納されている場合、compareWord
がchain
に含まれる可能性があるため、count
がチェックされる.チェック時に
compareWord
までのチェーン長を計算する必要があるため、dfs
関数を再呼び出す必要があります.すべての可能な鎖長
compareWord
においてmax
の値が求められる場合、map
にはword
およびcount + 1
が格納される.原因は
count + 1
で、現在はword
まで計算する必要があるため、1を増やした.完全なコード
class Solution {
public int longestStrChain(String[] words) {
int maxChain = 0;
Set<String> wordSet = new HashSet<>();
Map<String, Integer> wordChainMap = new HashMap<>();
for (String word: words) {
wordSet.add(word);
}
for (String word: words) {
maxChain = Math.max(maxChain, dfs(wordChainMap, wordSet, word));
}
return maxChain;
}
private int dfs(Map<String, Integer> map, Set<String> set, String word) {
if (map.containsKey(word)) return map.get(word);
int count = 0;
for (int i = 0; i < word.length(); i++) {
String compareWord = word.substring(0, i) + word.substring(i + 1);
if (set.contains(compareWord)) count = Math.max(count, dfs(map, set, compareWord));
}
map.put(word, count + 1);
return count + 1;
}
}
の最後の部分
昨日、今日は
dfs
アルゴリズムを使用して問題を解決しました.昨日
dfs
の問題を解いたのか分からないが、今回は少し早く解決したようで、私はとても喜んでいます.今回の位置付けを読んでいただき、フィードバックエラーを歓迎します:)
Reference
この問題について([Leet Code] Longest String Chain), 我々は、より多くの情報をここで見つけました https://velog.io/@khyunjiee/Leet-Code-Longest-String-Chainテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol