두 개의 문자열 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
s의 문자들과 t의 문자들을 순차적으로 Array
에 담고 문자에 해당하는 index
를 StringBuilder
로 붙여주었다. 최종 s의 숫자순서와 t의 숫자순서가 같을 경우 동형이므로 true
를 반환하고, 아닐 경우 false
를 반환했다.
처음엔 그냥 숫자로 붙이다가 25 21 0
과 25 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;
}
문자열 길이만큼 한번만 반복하면서 동시에 문자가 같은지에 대한 여부도 판단하니 훨씬 빠르다.
아스키코드에 대한 제한사항이 들어간 이유가 있구나.. 싶었던 풀이 👏