[JAVA | LeetCode] 205. Isomorphic Strings

연어·2022년 12월 29일
0

algorithm

목록 보기
17/21
post-thumbnail
post-custom-banner

출처 - https://leetcode.com/problems/isomorphic-strings/

문제

두 개의 문자열 s와 t가 동형인지 확인하는 문제이다. (s의 문자를 t로 대체할 수 있는 경우)

입력 예

Example 1
Input: s = "egg", t = "add"
Output: true
Example 2
Input: s = "foo", t = "bar"
Output: false
Example 3
Input: s = "paper", t = "title"
Output: true

제한사항

  • 1 <= s.length <= 5 * 104
  • t.length == s.length
  • s와 t는 유효한 아스키 문자로 구성된다.

풀이

s의 문자들과 t의 문자들을 순차적으로 Array에 담고 문자에 해당하는 indexStringBuilder로 붙여주었다. 최종 s의 숫자순서와 t의 숫자순서가 같을 경우 동형이므로 true를 반환하고, 아닐 경우 false를 반환했다.
처음엔 그냥 숫자로 붙이다가 25 21 025 2 10 처럼 숫자는 다르지만 붙였을 때 구분할 수 없는 경우를 확인하고 숫자 끝에 ,를 붙여 구분지었다.

class Solution {
    public boolean isIsomorphic(String s, String t) {
        List<String> srr = new ArrayList<>();
        List<String> trr = new ArrayList<>();

        StringBuilder sbS = new StringBuilder();
        StringBuilder sbT = new StringBuilder();

        for (String sword : s.split("")) {
            if (!srr.contains(sword)) srr.add(sword);
            sbS.append(srr.indexOf(sword)).append(",");

        }
        for (String tword : t.split("")) {
            if(!trr.contains(tword)) trr.add(tword);
            sbT.append(trr.indexOf(tword)).append(",");

        }

        if(sbS.toString().equals(sbT.toString())) return true;
        else return false;
    }
}

결과

혼자 생각한 대로 풀었더니, 통과는 되었지만 시간이 다소 걸린다.
소요시간을 조금 더 줄일 수 있는 방법이 무엇인지 다른 풀이를 찾아보았다.

다른 풀이

class Solution {
    public boolean isIsomorphic(String s, String t) {
        char[] srr = s.toCharArray();
        char[] trr = t.toCharArray();
		
        // 문자열 길이가 다른 경우 false
        if(srr.length != trr.length) return false;

        char[] sChar = new char[256];
        char[] tChar = new char[256];
		
        // 아스키코드에 해당하는 index에 문자 저장
        for (int i = 0; i < s.length(); i++) {
            char sc = srr[i];
            char tc = trr[i];

            if (sChar[sc] == 0 && tChar[tc] == 0) {
                sChar[sc] = tc;
                tChar[tc] = sc;
            } else {
            	// 서로 대응되는 문자가 다를 경우 false
                if (sChar[sc] != tc || tChar[tc] != sc) {
                    return false;
                }
            }
        }
    }
    return true;
}

문자열 길이만큼 한번만 반복하면서 동시에 문자가 같은지에 대한 여부도 판단하니 훨씬 빠르다.
아스키코드에 대한 제한사항이 들어간 이유가 있구나.. 싶었던 풀이 👏

profile
끄적이는 개발자
post-custom-banner

0개의 댓글