diff --git a/decode-ways/river20s.py b/decode-ways/river20s.py new file mode 100644 index 000000000..6b57daeb4 --- /dev/null +++ b/decode-ways/river20s.py @@ -0,0 +1,31 @@ +class Solution(object): + def numDecodings(self, s): + """ + 실제로 어떤 문자열로 바뀌는지는 중요하지 않음. + 유효한 디코딩 경로가 몇 가지인가를 구하는 문제. + DP를 사용하여 각 자리수에 대해 가능한 경우의 수를 누적하여 계산. + DP[i]는 i번째 자리까지의 경우의 수를 의미. + 점화식: DP[i] = DP[i-1] + DP[i-2] (i >= 2) + Time complexity: O(n) + Space complexity: O(n) + """ + # 문자열이 비어있거나 '0'으로 시작하면 디코딩 X + if not s or s[0] == '0': + return 0 + + n = len(s) + dp = [0] * (n + 1) + dp[0] = 1 # DP를 위한 기초 상태 초기화, 실제로 빈 문자열이 들어오는 것은 아님 + dp[1] = 1 # 첫 글자 디코딩 방법은 1가지 + + for i in range(2, n + 1): + # 한 자리 수 해석 가능 여부 확인 + # s[i-2:i]는 i >= 2일때만 의미가 있으므로 2부터 루프 시작 + if s[i - 1] != '0': # '0'은 유효하지 않으므로 제외 + dp[i] += dp[i - 1] # 유효한 '1'~'9'라면 앞까지의 경우의 수를 계승 + + # 두 자리 수 해석 가능 여부 확인 + if 10 <= int(s[i -2:i]) <= 26: + dp[i] += dp[i - 2] # 유효한 '10'~'26'이라면 앞까지의 경우의 수를 계승 + + return dp[n] diff --git a/number-of-1-bits/river20s.py b/number-of-1-bits/river20s.py new file mode 100644 index 000000000..104ab3d5b --- /dev/null +++ b/number-of-1-bits/river20s.py @@ -0,0 +1,13 @@ +class Solution(object): + def hammingWeight(self, n): + """ + :type n: int + :rtype: int + Time complexity: O(1) + Space complexity: O(1) + """ + count = 0 + for _ in range(32): + count += n & 1 + n >>= 1 + return count diff --git a/valid-palindrome/river20s.py b/valid-palindrome/river20s.py new file mode 100644 index 000000000..f95bb051f --- /dev/null +++ b/valid-palindrome/river20s.py @@ -0,0 +1,7 @@ +import re + +class Solution(object): + def isPalindrome(self, s): + s = s.lower() + s = re.sub(r'[^a-z0-9]', '', s) + return s == s[::-1]