Welcome to Subscribe On Youtube
2452. Words Within Two Edits of Dictionary
Description
You are given two string arrays, queries
and dictionary
. All words in each array comprise of lowercase English letters and have the same length.
In one edit you can take a word from queries
, and change any letter in it to any other letter. Find all words from queries
that, after a maximum of two edits, equal some word from dictionary
.
Return a list of all words from queries
, that match with some word from dictionary
after a maximum of two edits. Return the words in the same order they appear in queries
.
Example 1:
Input: queries = ["word","note","ants","wood"], dictionary = ["wood","joke","moat"] Output: ["word","note","wood"] Explanation: - Changing the 'r' in "word" to 'o' allows it to equal the dictionary word "wood". - Changing the 'n' to 'j' and the 't' to 'k' in "note" changes it to "joke". - It would take more than 2 edits for "ants" to equal a dictionary word. - "wood" can remain unchanged (0 edits) and match the corresponding dictionary word. Thus, we return ["word","note","wood"].
Example 2:
Input: queries = ["yes"], dictionary = ["not"] Output: [] Explanation: Applying any two edits to "yes" cannot make it equal to "not". Thus, we return an empty array.
Constraints:
1 <= queries.length, dictionary.length <= 100
n == queries[i].length == dictionary[j].length
1 <= n <= 100
- All
queries[i]
anddictionary[j]
are composed of lowercase English letters.
Solutions
-
class Solution { public List<String> twoEditWords(String[] queries, String[] dictionary) { List<String> ans = new ArrayList<>(); int n = queries[0].length(); for (var s : queries) { for (var t : dictionary) { int cnt = 0; for (int i = 0; i < n; ++i) { if (s.charAt(i) != t.charAt(i)) { ++cnt; } } if (cnt < 3) { ans.add(s); break; } } } return ans; } }
-
class Solution { public: vector<string> twoEditWords(vector<string>& queries, vector<string>& dictionary) { vector<string> ans; for (auto& s : queries) { for (auto& t : dictionary) { int cnt = 0; for (int i = 0; i < s.size(); ++i) cnt += s[i] != t[i]; if (cnt < 3) { ans.emplace_back(s); break; } } } return ans; } };
-
class Solution: def twoEditWords(self, queries: List[str], dictionary: List[str]) -> List[str]: ans = [] for s in queries: for t in dictionary: if sum(a != b for a, b in zip(s, t)) < 3: ans.append(s) break return ans
-
func twoEditWords(queries []string, dictionary []string) (ans []string) { for _, s := range queries { for _, t := range dictionary { cnt := 0 for i := range s { if s[i] != t[i] { cnt++ } } if cnt < 3 { ans = append(ans, s) break } } } return }
-
function twoEditWords(queries: string[], dictionary: string[]): string[] { const n = queries[0].length; return queries.filter(querie => { for (const s of dictionary) { let diff = 0; for (let i = 0; i < n; i++) { if (querie[i] !== s[i] && ++diff > 2) { break; } } if (diff <= 2) { return true; } } return false; }); }
-
impl Solution { pub fn two_edit_words(queries: Vec<String>, dictionary: Vec<String>) -> Vec<String> { let n = queries[0].len(); queries .into_iter() .filter(|querie| { for s in dictionary.iter() { let mut diff = 0; for i in 0..n { if querie.as_bytes()[i] != s.as_bytes()[i] { diff += 1; } } if diff <= 2 { return true; } } false }) .collect() } }
-
public class Solution { public IList<string> TwoEditWords(string[] queries, string[] dictionary) { var ans = new List<string>(); foreach (var s in queries) { foreach (var t in dictionary) { int cnt = 0; for (int i = 0; i < s.Length; i++) { if (s[i] != t[i]) { cnt++; } } if (cnt < 3) { ans.Add(s); break; } } } return ans; } }