프로그래밍-기본기/알고리즘(문제풀이)

[LeetCode] 14. Longest Common Prefix

독학백수 2024. 3. 27. 17:01
반응형

풀이.

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        string answer = "";
         size_t shortest_length = strs[0].length(); // 첫 번째 문자열의 길이로 초기화

    for (const auto& str : strs) {
        shortest_length = std::min(shortest_length, str.length());
    }

        for(int i = 0 ; i < shortest_length; i++){
            char firstStr = strs[0][i];
            for(int j = 1 ; j < strs.size(); j++){
                // std::cout << i << j << ":" <<strs[j][i] << std::endl;
                if(firstStr != strs[j][i]){
                    return answer;
                }
            }
            answer += firstStr;
        }
        return answer;
    }
};

먼저 strs중 가장 길이가 작은 문자열을 뽑는다.
이유는 문자열로 들어온 모든 값이 공통되어야 하며 3자리 2자리 3자리가 들어왔을 때 최대 공통될 수 있는 문자열의 갯수는 2개 이기 때문이다.

이후 가장 작은 문자열을 시작으로 다른 문자열의 자리수를 비교한다. 만약 하나라도 다르다면 곧바로 answer를 return하고 반복문을 빠져나오면 현재 문자열을 answer에 더해줘서 풀었다.


솔루션.

class Solution {
public:
    string longestCommonPrefix(vector<string>& strs) {
        std::sort(strs.begin(), strs.end());
        if (strs.size() == 1) {
            return strs[0];
        }
        if (strs[0] == strs[strs.size() - 1]) {
            return strs[0];
        }
        for (int i = 0; i < strs[0].length(); i++) {
            if (strs[strs.size() - 1][i] != strs[0][i]) {
                return strs[0].substr(0, i);
            }
        }
        return strs[0];
    }
};

(https://leetcode.com/problems/longest-common-prefix/solutions/4908025/c-easy-solution/)

이 사람이 푼것을 보면 sort를 통해 문자열의 길이중 가장 작은것을 찾고 사이즈가 1이거나, 0번째 인덱스와 마지막 인덱스 문자가 같다면 곧바로 strs의 첫번째를 리턴한다.

이후 맨 첫번째와 맨 마지막 배열의 문자열을 하나하나 비교하며 다른 녀석을 substr로 하나씩 빼준다.


 

반응형