LeetCode 75: 1657. Determine if Two Strings Are Close

김준수·2024년 3월 12일
0

LeetCode 75

목록 보기
22/63
post-custom-banner

1657. Determine if Two Strings Are Close

Description

Two strings are considered close if you can attain one from the other using the following operations:

  • Operation 1: Swap any two existing characters.
    • For example, abcde -> aecdb
  • Operation 2: Transform every occurrence of one existing character into another existing character, and do the same with the other character.
    • For example, aacabb -> bbcbaa (all a's turn into b's, and all b's turn into a's)
      You can use the operations on either string as many times as necessary.

Given two strings, word1 and word2, return true if word1 and word2 are close, and false otherwise.


한 문자열에서 다른 문자열을 다음 연산들을 사용하여 동일한 문자열을 얻을 경우 두 문자열이 가까운 것으로 간주합니다.

  • 연산 1: 기존의 두 문자를 바꿉니다.
    • 예를 들어, abcde -> aecdb
  • 연산 2: 한 기존문자를 다른 기존문자로 변환하고, 다른 기존 문자도 동일하게 한 기존문자로 변환합니다.
    • 예를 들어, aacabb -> bbcbaa (모든 a는 b로, 모든 b는 a로 바뀝니다)

필요한 만큼 얼마든지 두 문자열에서 연산을 사용할 수 있습니다.

word1과 word2 두 문자열이 주어집니다. word1과 word2가 가까우면 true를 반환하고 그렇지 않으면 false를 반환합니다.

Example 1:

Input: word1 = "abc", word2 = "bca"
Output: true
Explanation: word1에서 word2를 두 번의 연산으로 얻을 수 있습니다.
연산 1 적용: "abc" -> "acb"
연산 1 적용: "acb" -> "bca"

Example 2:

Input: word1 = "a", word2 = "aa"
Output: false
Explanation: word1에서 word2를 얻는 것은 불가능하며, 그 반대의 경우도 마찬가지입니다.

Example 3:

Input: word1 = "cabbba", word2 = "abbccc"
Output: true
Explanation: 3번의 연산으로 word1에서 word2를 얻을 수 있습니다.
연산 1 적용: "cabbba" -> "caabbb"
연산 2 적용: "caabbb" -> "baaccc"
연산 2 적용: "baaccc" -> "abbccc"

Constraints:

  • 1 <= word1.length, word2.length <= 105
  • wword1과 word2는 소문자 영어만 포함합니다.

Solution


import java.util.stream.Collectors;
import java.util.*;

class Solution {
    public boolean closeStrings(String word1, String word2) {
        if(word1.length() != word2.length())
            return false;

        Map<Character, Long> word1Map = word1.chars().mapToObj(c -> (char) c).collect(Collectors.groupingBy(c -> c, Collectors.counting()));
        Map<Character, Long> word2Map = word2.chars().mapToObj(c -> (char) c).collect(Collectors.groupingBy(c -> c, Collectors.counting()));

        Set<Character> word1CharSet = word1Map.keySet();
        Set<Character> word2CharSet = word2Map.keySet();
        if(!word1CharSet.equals(word2CharSet))
            return false;

        List<Long> values1 = word1Map.values().stream().sorted().collect(Collectors.toList());
        List<Long> values2 = word2Map.values().stream().sorted().collect(Collectors.toList());
        if(!values1.equals(values2))
            return false;
            
        return true;
    }

}


post-custom-banner

0개의 댓글