솔루션: 외계인 사전 확인
Leetcode 문제 #953(쉬움): 외계인 사전 확인하기
설명:
(이동: Solution Idea || 코드: JavaScript | Python | Java | C++ )
In an alien language, surprisingly they also use english lowercase letters, but possibly in a different
order
. Theorder
of the alphabet is some permutation of lowercase letters.Given a sequence of
words
written in the alien language, and theorder
of the alphabet, returntrue
if and only if the givenwords
are sorted lexicographicaly in this alien language.
예:
Example 1: Input: words = ["hello","leetcode"]
order = "hlabcdefgijkmnopqrstuvwxyz"Output: true Explanation: As 'h' comes before 'l' in this language, then the sequence is sorted.
Example 2: Input: words = ["word","world","row"]
order = "worldabcefghijkmnpqstuvxyz"Output: false Explanation: As 'd' comes after 'l' in this language, then words[0] > words[1], hence the sequence is unsorted.
Example 3: Input: words = ["apple","app"]
order = "abcdefghijklmnopqrstuvwxyz"Output: false Explanation: The first three characters "app" match, and the second string is shorter (in size.) According to lexicographical rules "apple" > "app", because 'l' > '∅', where '∅' is defined as the blank character which is less than any other character (More info).
제약 조건:
1 <= words.length <= 100
1 <= words[i].length <= 20
order.length == 26
- All characters in
words[i]
andorder
are English lowercase letters.
아이디어:
(이동: Problem Description || 코드: JavaScript | Python | Java | C++ )
여기서 순진한 접근 방식은 입력 배열(W)에서 연속된 단어 쌍을 반복하고 입력 알파벳(O)에서 각 문자의 위치를 비교하여 불일치를 찾고 어떤 단어가 나오는지 결정할 수 있을 때까지 문자를 이동하는 것입니다. 먼저 사전적으로.
이것은 쉬운 질문이므로 이 방법은 작동하지만 시간 복잡도가 O(N * M * P)인 경우 N은 W의 길이, M은 W의 각 단어의 평균 길이, P는 길이입니다. 영형.
그러나 O에서 문자의 위치를 반복적으로 찾는 대신 O(P)의 시간 복잡도에서 O(알파)에서 인덱스의 조회 테이블을 만들고 모든 위치 조회를 간단한 O(1) 연산으로 전환할 수 있습니다. 그러면 전체 시간 복잡도가 O(N * M + P)로 변경됩니다.
그런 다음 이전에 언급했듯이 W에서 단어 쌍(a, b)을 반복한 다음 해당 두 단어의 비교 문자(achar, bchar)를 반복하고 사전 색인(aix, bix)을 기반으로 평가할 수 있습니다.
aix < bix이거나 끝에 도달하면 두 단어가 올바른 사전순으로 되어 있으므로 다음 단어 쌍으로 이동해야 합니다. aix > bix이거나 b의 끝에 도달하면 두 단어가 올바른 사전 순서가 아니므로 false를 반환해야 합니다.
종료하지 않고 끝에 도달하면 true를 반환해야 합니다.
구현:
4개 언어 모두에 대한 코드에는 약간의 차이만 있습니다.
자바스크립트 코드:
(이동: Problem Description || Solution Idea )
var isAlienSorted = function(W, O) {
let alpha = new Map([["",-1]])
for (let i = 0; i < O.length; i++)
alpha.set(O.charAt(i), i)
for (let i = 1; i < W.length; i++) {
let a = W[i-1], b = W[i]
for (let j = 0; j < a.length; j++) {
let achar = a.charAt(j), bchar = b.charAt(j),
aix = alpha.get(achar), bix = alpha.get(bchar)
if (aix < bix) break
if (aix > bix) return false
}
}
return true
};
파이썬 코드:
(이동: Problem Description || Solution Idea )
class Solution:
def isAlienSorted(self, W: List[str], O: str) -> bool:
alpha = {O[i]: i for i in range(len(O))}
for i in range(1,len(W)):
a, b = W[i-1], W[i]
for j in range(len(a)):
if j == len(b): return False
achar, bchar = a[j], b[j]
aix, bix = alpha[achar], alpha[bchar]
if aix < bix: break
if aix > bix: return False
return True
자바 코드:
(이동: Problem Description || Solution Idea )
class Solution {
public boolean isAlienSorted(String[] W, String O) {
Map<Character,Integer> alpha = new HashMap<>();
for (int i = 0; i < O.length(); i++)
alpha.put(O.charAt(i), i);
for (int i = 1; i < W.length; i++) {
String a = W[i-1], b = W[i];
for (int j = 0; j < a.length(); j++) {
if (j == b.length()) return false;
char achar = a.charAt(j), bchar = b.charAt(j);
if (alpha.get(achar) < alpha.get(bchar)) break;
if (alpha.get(achar) > alpha.get(bchar)) return false;
}
}
return true;
}
}
C++ 코드:
(이동: Problem Description || Solution Idea )
class Solution {
public:
bool isAlienSorted(vector<string>& W, string O) {
unordered_map<char,int> alpha;
for (int i = 0; i < O.size(); i++)
alpha[O[i]] = i;
for (int i = 1; i < W.size(); i++) {
string a = W[i-1], b = W[i];
for (int j = 0; j < a.size(); j++) {
if (j == b.size()) return false;
char achar = a[j], bchar = b[j];
if (alpha[achar] < alpha[bchar]) break;
if (alpha[achar] > alpha[bchar]) return false;
}
}
return true;
}
};
Reference
이 문제에 관하여(솔루션: 외계인 사전 확인), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/seanpgallivan/solution-verifying-an-alien-dictionary-76f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)