Longest Substring With At Most Two Distinct

Given a string s, find the length of the longest substring t that contains at most 2 distinct characters. ์ตœ๋Œ€ 2๊ฐœ์˜ ๊ตฌ๋ถ„๋˜ ์ฒ ์ž๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฐ€์žฅ ๊ธด substring์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•ด๋ผ.

Example 1 : Input : "eceba" Output : 3 Explanation : t is "ece" which its length is 3.

Example 2 : Input : "ccaabbb" Output : 5 Explanation : t is "aabbb" which its length is 5.

์ž๋ฃŒ๊ตฌ์กฐ : ์ •์ˆ˜ํ˜• ๋ณ€์ˆ˜ 4๊ฐœ, Map(Character, Integer) 1. start : ์‹œ์ž‘ ์ธ๋ฑ์Šค 2. end : ๋ ์ธ๋ฑ์Šค 3. count : ๋ฌธ์ž์—ด์˜ ๊ฐฏ์ˆ˜ 4. leng : ๋ฌธ์ž์—ด์˜ ๊ธธ์ด(end-start ์ค‘ ํฐ ๊ฐ’)

์•Œ๊ณ ๋ฆฌ์ฆ˜ 1. Map์— ์ €์žฅํ•œ๋‹ค. - c 2๊ฐœ, a 2๊ฐœ, b 4๊ฐœ => (c,2) (a,2) (b,4) 2. ๋ฌธ์ž์˜ ๊ฐฏ์ˆ˜๋Š” ์ตœ๋Œ€ 2๊ฐœ์ด๋‹ค. - ๋ฌธ์ž ๊ฐฏ์ˆ˜(count)๊ฐ€ 2๊ฐœ ๋„˜๋Š”๋‹ค๋ฉด start(์‹œ์ž‘ ์ธ๋ฑ์Šค)๋กœ ์ด๋ฅผ ์ œ์–ดํ•œ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜์„ Java๋กœ ๊ตฌํ˜„

package java_basic;
import java.util.*;

public class LongestSubMostTwo {

	public static void main(String[] args) {
		String s = "ccaabbb";
		System.out.println(solve(s));
	}

	private static int solve(String s) {
		//1. ๊ทธ๋ฆ‡ ์ƒ์„ฑ 
		Map<Character, Integer> map = new HashMap<>();//(c,2) (a,2) (b,3)
		int start = 0, end = 0, count = 0, leng = 0;
		
		//2. ๋ฐ˜๋ณต๋ฌธ ๋Œ๋ฆฐ๋‹ค.
		while(end < s.length()) {
			char c = s.charAt(end);
			map.put(c, map.getOrDefault(c, 0)+1);//(c,2) (a,2)
			if(map.get(c) == 1) count++;//new char, count๋Š” 2๊ฐ€ ๋œ๋‹ค. 
			end++;
			
			while(count > 2) {//๋ฌธ์ž ๊ฐฏ์ˆ˜๊ฐ€ 2๋ณด๋‹ค ๋งŽ์œผ๋ฉด! 
				char tmp = s.charAt(start);
				map.put(tmp,map.get(tmp)-1);
				if(map.get(tmp) == 0) { 
					count--;
				}
				start++;
			}
			//3. leng ๋ฆฌํ„ด
			leng = Math.max(leng, end-start);
		}
		return leng;
		
	}

}

๋ฐฐ์šด ๋‚ด์šฉ ์ •๋ฆฌ(Java ๋ฌธ๋ฒ• ๋ฐ ๋ฉ”์†Œ๋“œ) 1. Map.getOrDefault() : ์ฐพ๋Š” ํ‚ค๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด ์ฐพ๋Š” ํ‚ค์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์—†๋‹ค๋ฉด ๊ธฐ๋ณธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ

getOrDefault(Object key, V DefaultValue)
char c = s.charAt(end);
map.put(c, map.getOrDefault(c, 0)+1);
//์ฒ˜์Œ์—๋Š” c๊ฐ€ map์— ์—†์œผ๋‹ˆ 0์„ ๋ฆฌํ„ด.
//=>map.put(c,1)
//map์— (c,1)์ด ์กด์žฌํ•˜๋‹ˆ๊นŒ ํ•ด๋‹น ๊ฐ’์ธ 1์„ ๋ฆฌํ„ด!
//=>map.put(c,1+1)=>map.put(c,2)

Last updated

Was this helpful?