Leetcode 242. 유효한 아나그램. DSA # 5
질문 링크
쉬운
Python
이 질문에서 우리는 두 문자열이 서로의 애너그램인지 아닌지를 확인해야 합니다.
두 문자열이 동일한 문자를 가지고 있는지 확인해야 함을 의미합니다.
이제 어떻게 확인할 수 있습니까?
예:
s = "anagram", t = "nagaram"
정렬 후:
s = "aagmnr", t = "aagmnr"
이제 두 문자열을 비교할 수 있습니다.
그러나이 접근 방식은 O(nlogn) 시간 복잡성이 필요합니다. 그리고 우리는 그것을 원하지 않습니다
다음과 같이 생각할 수 있습니다.
예를 들어 이해해 봅시다.
s = "anagram", t = "nagaram"
storage = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
- We iterate over the string s and store the count of each character in the array.
- s = "anagram"
---------------------------
1. a -> storage[0] = 1
2. n -> storage[13] = 1
3. a -> storage[0] = 2
4. g -> storage[6] = 1
5. r -> storage[17] = 1
6. a -> storage[0] = 3
7. m -> storage[12] = 1
---------------------------
storage = [3, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
Now we iterate over the string t and check if we encounter 0 or not
If we encounter 0 then that means that this character is not present in the string s.
- t = "nagaram"
---------------------------
1. n -> storage[13] = 1 Since n is present we subtract 1 from storage[13] = 0
2. a -> storage[0] = 3 Since a is present we subtract 1 from storage[0] = 2
3. g -> storage[6] = 1 Since g is present we subtract 1 from storage[6] = 0
4. a -> storage[0] = 2 Since a is present we subtract 1 from storage[0] = 1
5. r -> storage[17] = 1 Since r is present we subtract 1 from storage[17] = 0
6. a -> storage[0] = 1 Since a is present we subtract 1 from storage[0] = 0
7. m -> storage[12] = 1 Since m is present we subtract 1 from storage[12] = 0
---------------------------
Since we don't encounter 0 in the array, we can return True.
Let's take another example:
s = "abbcc", t = "abbccc"
storage = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
- s = "abbcc"
---------------------------
1. a -> storage[0] = 1
2. b -> storage[1] = 1
3. b -> storage[1] = 2
4. c -> storage[2] = 1
5. c -> storage[2] = 2
---------------------------
storage = [1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
- t = "abbccc"
----------------
1. a -> storage[0] = 1 Since a is present we subtract 1 from storage[0] = 0
2. b -> storage[1] = 2 Since b is present we subtract 1 from storage[1] = 1
3. b -> storage[1] = 1 Since b is present we subtract 1 from storage[1] = 0
4. c -> storage[2] = 2 Since c is present we subtract 1 from storage[2] = 1
5. c -> storage[2] = 1 Since c is present we subtract 1 from storage[2] = 0
6. c -> storage[2] = 0 Sice we encounter 0 in the array, we can return False.
---------------------------
구현해 봅시다:
def isAnagram(s: str, t: str) -> bool:
s_length, t_length = len(s), len(t)
if s_length != t_length:
return False
storage = [0] * 26
for char in s:
storage[ord(char) - ord('a')] += 1
for char in t:
if storage[ord(char) - ord('a')] == 0:
return False
storage[ord(char) - ord('a')] -= 1
return True
시간 복잡도: O(n)
공간 복잡도: O(26) = O(1)
크기가 26인 배열을 사용하는 대신 사전을 사용하여 각 문자의 수를 저장할 수 있습니다.
def isAnagram(self, s: str, t: str) -> bool:
s_length, t_length = len(s), len(t)
if s_length != t_length:
return False
storage = {}
for char in s:
storage[char] = storage.get(char, 0) + 1
for char in t:
if char not in storage or storage[char] == 0:
return False
storage[char] -= 1
return True
Reference
이 문제에 관하여(Leetcode 242. 유효한 아나그램. DSA # 5), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/uchihaitachi0/leetcode-242-valid-anagram-dsa-5-4bg1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)