자료구조 공부/String

백준 16916 (부분 문자열)

kdhoooon 2021. 4. 20. 19:43

문제


문자열 S의 부분 문자열이란, 문자열의 연속된 일부를 의미한다.

예를 들어, "aek", "joo", "ekj"는 "baekjoon"의 부분 문자열이고, "bak", "p", "oone"는 부분 문자열이 아니다.

문자열 S와 P가 주어졌을 때, P가 S의 부분 문자열인지 아닌지 알아보자.

 

 

 

 

풀이


conpulake.tistory.com/58?category=853119

 

백준 1786 (찾기)

www.acmicpc.net/problem/1786 1786번: 찾기 첫째 줄에, T 중간에 P가 몇 번 나타나는지를 나타내는 음이 아닌 정수를 출력한다. 둘째 줄에는 P가 나타나는 위치를 차례대로 공백으로 구분해 출력한다. 예컨

conpulake.tistory.com

 

위의 문제와 동일하지만 다른점은 해당 문자열이 포함되어있는지를 파악하는 문제다.

 

KMP알고리즘에 대해 정확하게 파악하고 있는것이 좋겠다.

문자열에서 부분문자열을 사용할 때 자주 사용되는 것 같다.

 

위에서 pi 를 구하고 kmp 알고리즘을 행하는 것을 똑같이 사용하면 된다.

 

<전체코드>

import java.io.*;
import java.util.*;

public class Main {	
	static StringBuilder sb = new StringBuilder();
	
	
	public static void main(String[] args) throws IOException{
		BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
		
		String P = bufferedReader.readLine();
		String S = bufferedReader.readLine();
		
		int j = 0;
		int[] table = new int[S.length()];
		for(int i = 1 ; i < S.length() ; i++) {
			while(j > 0 && S.charAt(i) != S.charAt(j)) {
				j = table[j - 1];
			}
			
			if(S.charAt(i) == S.charAt(j)) {
				table[i] = ++j;
			}
		}
		
		j = 0;
		boolean isTrue = false;
		for(int i = 0 ; i < P.length() ; i++) {
			
			while(j > 0 && P.charAt(i) != S.charAt(j)) {
				j = table[j - 1];
			}
			
			if(P.charAt(i) == S.charAt(j)) {
				j++;
			}
			
			if(j == S.length()) {
				isTrue = true;
				break;
			}
		}
		
		if(isTrue)
			sb.append(1);
		else
			sb.append(0);
		
		System.out.println(sb);
	}
}

'자료구조 공부 > String' 카테고리의 다른 글

백준 4354 (문자열 제곱)  (0) 2021.04.21
백준 1305 (광고)  (0) 2021.04.21
백준 1701 (Cubeditor)  (0) 2021.04.20
백준 1062 (가르침)  (0) 2021.04.20
정규표현식 정리 - 백준 (1013, 2857, 2671, 2870)해설 포함  (0) 2021.03.23