2개의 문자열 s1과 s2가 있다고 가정하면 s2의 모든 문자가 효율적으로 사용되도록 s1에서 가장 작은 부분 문자열을 찾아야 합니다.
따라서 입력이 s1 ="나는 학생입니다", s2 ="mdn"과 같으면 출력은 "m a studen"이 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
N :=26
-
str_len :=main_str의 크기, patt_len :=패턴의 크기
-
str_len
-
반환 없음
-
-
hash_pat :=크기가 N이고 0으로 채워지는 배열
-
hash_str :=크기가 N이고 0으로 채워지는 배열
-
범위 0에서 patt_len까지의 i에 대해 수행
-
hash_pat[ASCII of(pattern[i]) ] :=hash_pat[ASCII of(pattern[i]) ] + 1
-
-
시작 :=0, 시작 인덱스 :=-1, min_len :=inf
-
개수 :=0
-
범위 0에서 str_len까지의 j에 대해 수행
-
hash_str[ASCII of(main_str[j]) ] :=hash_str[ASCII of(main_str[j]) ] + 1
-
hash_pat[ASCII of(main_str[j]) ]가 0과 같지 않고 hash_str[ASCII of(main_str[j]) ] <=hash_pat[ASCII of(main_str[j]) ]이면
-
개수 :=개수 + 1
-
-
count가 patt_len과 같으면
-
hash_str[ASCII of(main_str[start]) ]> hash_pat[ASCII of(main_str[start]) ] 또는 hash_pat[ASCII of(main_str[start]) ]가 0과 같을 때 do
-
hash_str[ASCII of(main_str[start])]> hash_pat[ASCII of(main_str[start])]이면
-
hash_str[ASCII of(main_str[start]) ] :=hash_str[ASCII of(main_str[start]) ] - 1
-
-
시작 :=시작 + 1
-
-
len_window :=j - 시작 + 1
-
min_len> len_window이면
-
min_len :=len_window
-
start_index :=시작
-
-
-
-
start_index가 -1과 같으면
-
반환 없음
-
-
main_str의 하위 문자열 반환[인덱스 start_index에서 start_index + min_len까지]
예
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
N = 256 def get_pattern(main_str, pattern): str_len = len(main_str) patt_len = len(pattern) if str_len < patt_len: return None hash_pat = [0] * N hash_str = [0] * N for i in range(0, patt_len): hash_pat[ord(pattern[i])] += 1 start, start_index, min_len = 0, -1, float('inf') count = 0 for j in range(0, str_len): hash_str[ord(main_str[j])] += 1 if (hash_pat[ord(main_str[j])] != 0 and hash_str[ord(main_str[j])] <= hash_pat[ord(main_str[j])]): count += 1 if count == patt_len: while (hash_str[ord(main_str[start])] > hash_pat[ord(main_str[start])] or hash_pat[ord(main_str[start])] == 0): if (hash_str[ord(main_str[start])] > hash_pat[ord(main_str[start])]): hash_str[ord(main_str[start])] -= 1 start += 1 len_window = j - start + 1 if min_len > len_window: min_len = len_window start_index = start if start_index == -1: return None return main_str[start_index : start_index + min_len] main_str = "I am a student" pattern = "mdn" print(get_pattern(main_str, pattern))
입력
"I am a student", "mdn"
출력
m a studen