-
1786번: 찾기
첫째 줄에, T 중간에 P가 몇 번 나타나는지를 나타내는 음이 아닌 정수를 출력한다. 둘째 줄에는 P가 나타나는 위치를 차례대로 공백으로 구분해 출력한다. 예컨대, T의 i~i+m-1번 문자와 P의 1~m
www.acmicpc.net
코드
def find(pattern): lps = [0 for _ in range(len(pattern))] leng = 0 i = 1 while i < len(pattern): if pattern[i] == pattern[leng]: leng += 1 lps[i] = leng i += 1 else: if leng != 0: leng = lps[leng - 1] else: lps[i] = 0 i += 1 return lps def kmp(search, source): m = len(search) n = len(source) result = [] lps = find(search) i = 0 j = 0 while i < n: if search[j] == source[i]: i += 1 j += 1 if j == m: result.append(str(i-j+1)) j = lps[j - 1] else: if j != 0: j = lps[j-1] else: i += 1 return result def main(): sourceString = input() searchString = input() result = kmp(searchString, sourceString) print(len(result)) print(" ".join(result)) if __name__ == "__main__": main()
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 4354번 문자열 제곱 (파이썬) (0) 2022.01.06 [백준] 11723번 집합 (파이썬) (0) 2022.01.06 [백준] 15681번 트리와 쿼리 (파이썬) (0) 2022.01.06 [백준] 9372번 상근이의 여행 (파이썬) (0) 2022.01.06 [백준] 1717번 집합의 표현 (파이썬) (0) 2022.01.06