-
HackerRank Interview Preparation Kit > String ManipulationAlgorithm/hackerrank 2018. 7. 17. 14:33
HackerRank의 Interview Preparation Kit > String Manipulation의 Medium 이상 문제
Sherlock and Valid String - medium
문제요약
입력 string s의 각 문자의 개수가 동일하거나 문자 하나만 제거해서 모두 동일해지면 'YES'아니면 'NO' 리턴 (1<=|s|<=10^5)
Sample Input
aabbcd
Sample output
NO
풀이
각 문자의 개수를 센다음 위 조건이 맞는지 판단
Special Palindrome Again - medium
문제요약
입력 string의 substring 중 palindromic string의 갯수(1<=|s|<=10^6)
palindromic string : 전체가 모두 같은 글자, 가운데 글자를 제외하고 모두 같은 글자
Sample Input
5
asasd
Sample output
7
풀이
처음엔 홀수인 경우와 짝수인 경우를 나눠서 일일이 계산
하지만 문자 갯수를 세면 좀 더 빠르게 구할 수 있다. 예로 aabaa 인 경우 a=2 b=1 a=2가 되고 모두 같은 경우는 길이가 n일 때 n*(n+1)/2가 된다. 즉 3+1+3=7(a, a, aa, b, a, a, aa) 가운데만 다른 경우는 갯수가 1인 문자의 양쪽 문자가 같은 경우 더 짧은 길이 만큼이 된다. b=1이고 양쪽다 a이므로 2(aba, aabaa). 둘을 더해주면 전체 palindromic string의 갯수가 나온다. (discussions을 보고 알았다...)
Common Child - medium
문제요약
두 string에서 각각 0개 이상의 문자를 지웠을 때 서로 같아지는 string의 최대 길이 계산
LCS(최장 공통 부분 수열) 문제
Sample Input
HARRY
SALLY
Sample output
2
풀이
discussion을 보고 이해했다. 알고리즘에서는 고전에 속하는 내용인 듯 하다.
주어진 두 문자열(s1, s2)에서 일부를 지웠을 때의 최장 공통 부분 수열을 계산한다. 자세한 설명은 최장 공통 부분 수열을 참고하면 이해하기 쉽다. 결국 DP 문제로 어떤 위치(s1[i],s2[j]) 까지의 최장 공통 부분 수열을 고려할 때, s1[i] == s2[j]라면 LCS(s1[i], s2[j])는 LCS(s1[i-1], s2[j-1])+s1[i]와 같다. 만약 s1[i] != s2[j]라면 LCS(s1[i], s2[j])는 max(LCS(s1[i-1],s2[j]), LCS(s1[i], s2[j-1]))과 같다. 길이가 0인 경우는 빈 문자열이 되고, s1 * s2 배열에서 위 조건에 맞게 계산을 하면 마지막 계산된 값이 두 문자열의 LCS가 된다.
알고리즘을 알고 나면 구현은 어렵지 않은 문제로, 두 문자열의 길이를 n,m이라고 하면 O(n+m)의 시간과 공간을 사용한다. python3에서는 time out이 발생하고, pypy3로 pass된다.
비슷한 문제로 최장 공통 부분 문자열도 있다.