[LeetCode] 7.Longest Common Prefix

2020. 12. 30. 17:47

leetcode.com/problems/longest-common-prefix/

 

Longest Common Prefix - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

1. Problem

Write a function to find the longest common prefix string amongst an array of strings.

If there is no common prefix, return an empty string "".

 

Example 1:

Input: strs = ["flower","flow","flight"] Output: "fl"

 

Example 2:

Input: strs = ["dog","racecar","car"] Output: "" Explanation: There is no common prefix among the input strings.

 

Constraints:

  • 0 <= strs.length <= 200
  • 0 <= strs[i].length <= 200
  • strs[i] consists of only lower-case English letters.

2. Code

package leetCode;

public class LogestCommonPrefix_easy { //앞에만 같으면 되는 중복값

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String[] strs = {"flower"};
		System.out.println(longestCommonPrefix(strs));
	}
	
	public static String longestCommonPrefix(String[] strs) {
		if(strs.length == 1) {
			return strs[0];
		}
		
		String result = "";
		
		for(int i = 0 ; i < strs.length; i++) {
			if(i == 0) {
				result = commonPrefix(strs[i], strs[i+1]);
				i++;
			} else {
				result = commonPrefix(result, strs[i]);
			}		
		}
		return result;
	}
	
	public static String commonPrefix(String s1, String s2) {
		String result = "";
		int shortSize = shortSize(s1, s2);
		for(int j = 0 ; j < shortSize; j++) {
			if(s1.charAt(j) == s2.charAt(j)) {
				result = result + s1.charAt(j);
			} else {
				break;
			}
		}
		return result;
	}
	
	public static int shortSize(String s1, String s2) {
		if(s1.length() <= s2.length()) {
			return s1.length();
		}
		return s2.length();
	}
}

 

3. Report

그냥 중복값인줄 알고 엄청 복잡하게 짰다가 수정했다

input이 String[] strs = {"reflower" , "flower", "flight"} 일때

output이 "fl"이 나오게 하는 줄 알았는데

앞에서부터 같은 문장 찾는거였다..

괜히 시간만 낭비 T^T

 

아쉬우니까 그냥 중복값 코드도 추가해본다

 

package leetCode;

import java.util.ArrayList;


public class LongestCommonPrefix {

	public static void main(String[] args) {
		String[] strs = {""};
		System.out.println(longestCommonPrefix(strs));
	}

	public static String longestCommonPrefix(String[] strs) {
        if(strs.length == 1) {
			return strs[0];
		}
		strs = ascArray(strs);
		//System.out.println(strs[0] + " " + strs[1] + " " + strs[2]);
		ArrayList<String> resultList = new ArrayList();

		//두개의 공통 string을 반환해주는 ArrayList를 이용하자!
		for(int i = 0; i < strs.length; i++) {
			if(i==0) {
				resultList = commonList(strs[i], strs[i+1]);
				i++;
				//resultList에는 flow가 들어있음
			} else {
				for(int j = 0; j < resultList.size(); j++) {//j=0일떄 fl, j=1일때 er
					if(!strs[i].contains(resultList.get(j))) {
						resultList.remove(j);
						j--;
					}
				}
			}		
		}
		if(resultList.size() == 0) {
			return "";
		}
		
		return resultList.get(0);
	}

	public static String[] ascArray(String[] strs) {
		for(int i = 0; i < strs.length-1; i++) {
			if(strs[i+1].length() < strs[i].length()) {
				String temp = strs[i];
				strs[i] = strs[i+1];
				strs[i+1] = temp;
			}
		}
		return strs;
	}

	public static ArrayList<String> commonList(String shortS, String longS){
		ArrayList al = new ArrayList(); //공통된걸 담은 ArrayList

		for(int i = 0; i < shortS.length(); i++) {
			for(int j = 0; j < i+1; j++) {
                String result = "";
				for(int k = j; k < shortS.length()-i+j; k++) {
					result = result + shortS.charAt(k); //sh[k];
				}
				if(longS.contains(result)) {
					al.add(result);
				}
			}		
		}
		return al;
	}
}

"flow"를 쪼갠다고 칠때

flow, flo, low, fl, lo , ow, f, l, o, w

이렇게 쪼개는데 무진장 고생했다..ㅎ

더 쉬운 방법이 있다고 들었는데 다음에 따라해보도록한다..

 

4. Learned

[자바 특정 문자열 포함 확인 및 찾기]

 

1) contains()   :  포함여부

String s = "hello"

if(s.contains("he")) = true

 

2) indexOf()   :  포함된 특정 문자나 문자열0 시작위치 인덱스 반환 (없으면 -1 반환)

String s = "helloWorld"

s.indexOf("Wo") = 5

 

3) mathces()  :  정규식을 이용하여 특정 문자 검색

 

자주쓰는 정규식 패턴

숫자만 : ^[0-9]*$
영문만 : ^[a-zA-Z]*$
영문만, 띄어쓰기가능 : /^[a-zA-Z\s]+$/
한글만 : ^[가-힣]*$
한글만,띄어쓰기가능 :  /^[가-힣\s]+$/
한글 & 영문만 : /^[가-힣a-zA-Z]+$/;
영문 & 숫자만 : ^[a-zA-Z0-9]*$
E-Mail : ^[a-zA-Z0-9]+@[a-zA-Z0-9]+$
휴대폰 : ^01(?:0|1|[6-9]) - (?:\d{3}|\d{4}) - \d{4}$
일반전화 : ^\d{2,3} - \d{3,4} - \d{4}$
URL : /^(file|gopher|news|nntp|telnet|https?|ftps?|sftp):\/\/([a-z0-9-]+\.)+[a-z0-9]{2,4}.*$/
주민등록번호 : \d{6} \- [1-4]\d{6}
IP 주소 : ([0-9]{1,3}) \. ([0-9]{1,3}) \. ([0-9]{1,3}) \. ([0-9]{1,3})

 

'Algorithm > 문제' 카테고리의 다른 글

[LeetCode] 9.Remove Duplicates from Sorted Array  (0) 2021.01.04
[LeetCode] 8.Remove Element  (0) 2021.01.04
[LeetCode] 6.Merge Two SortedLists  (0) 2020.12.30
[LeetCode] 5.Palindrome Number  (0) 2020.12.29
[LeetCode] 4.Reverse Integer  (0) 2020.12.28

BELATED ARTICLES

more