zoukankan      html  css  js  c++  java
  • LeetCode 1061. Lexicographically Smallest Equivalent String

    原题链接在这里:https://leetcode.com/problems/lexicographically-smallest-equivalent-string/

    题目:

    Given strings A and B of the same length, we say A[i] and B[i] are equivalent characters. For example, if A = "abc" and B = "cde", then we have 'a' == 'c', 'b' == 'd', 'c' == 'e'.

    Equivalent characters follow the usual rules of any equivalence relation:

    • Reflexivity: 'a' == 'a'
    • Symmetry: 'a' == 'b' implies 'b' == 'a'
    • Transitivity: 'a' == 'b' and 'b' == 'c' implies 'a' == 'c'

    For example, given the equivalency information from A and B above, S = "eed""acd", and "aab" are equivalent strings, and "aab" is the lexicographically smallest equivalent string of S.

    Return the lexicographically smallest equivalent string of S by using the equivalency information from A and B.

    Example 1:

    Input: A = "parker", B = "morris", S = "parser"
    Output: "makkek"
    Explanation: Based on the equivalency information in A and B, we can group their characters as [m,p], [a,o], [k,r,s], [e,i]. The characters in each group are equivalent and sorted in lexicographical order. So the answer is "makkek".
    

    Example 2:

    Input: A = "hello", B = "world", S = "hold"
    Output: "hdld"
    Explanation:  Based on the equivalency information in A and B, we can group their characters as [h,w], [d,e,o], [l,r]. So only the second letter 'o' in S is changed to 'd', the answer is "hdld".
    

    Example 3:

    Input: A = "leetcode", B = "programs", S = "sourcecode"
    Output: "aauaaaaada"
    Explanation:  We group the equivalent characters in A and B as [a,o,e,r,s,c], [l,p], [g,t] and [d,m], thus all letters in S except 'u' and 'd' are transformed to 'a', the answer is "aauaaaaada".

    Note:

    1. String AB and S consist of only lowercase English letters from 'a''z'.
    2. The lengths of string AB and S are between 1 and 1000.
    3. String A and B are of the same length.

    题解:

    A and B are equal, for each index, the corresponding character in A and B should be in the same union.

    When do the union, union by rank. a<c, a is c's parent.

    Later, for each character of S, find its ancestor and append it to result.

    Time Complexity: O((m+n)logm). m = A.length(), n = S.length(). find takes O(logm). 

    With path compression and union by rank, amatorize O(1).

    Space: O(m).

    AC Java:

     1 class Solution {
     2     Map<Character, Character> parent = new HashMap<>();
     3     
     4     public String smallestEquivalentString(String A, String B, String S) {
     5         for(int i = 0; i<A.length(); i++){
     6             char a = A.charAt(i);
     7             char b = B.charAt(i);
     8             
     9             if(find(a) != find(b)){
    10                 union(a, b);
    11             }
    12         }
    13         
    14         StringBuilder sb = new StringBuilder();
    15         for(int i = 0; i<S.length(); i++){
    16             char anc = find(S.charAt(i));
    17             sb.append(anc);
    18         }
    19         
    20         return sb.toString();
    21     }
    22     
    23     private char find(char c){
    24         parent.putIfAbsent(c, c);
    25         if(c != parent.get(c)){
    26             char anc = find(parent.get(c));
    27             parent.put(c, anc);
    28         }
    29         
    30         return parent.get(c);
    31     }
    32     
    33     private void union(char a, char b){
    34         char c1 = find(a);
    35         char c2 = find(b);
    36         if(c1 < c2){
    37             parent.put(c2, c1);
    38         }else{
    39             parent.put(c1, c2);
    40         }
    41     }
    42 }
  • 相关阅读:
    DHCP协议详解(硬件方面原理)
    ASP.NET安全认证
    JAVA打包成.jar可运行项目
    JAVA菜单事件
    JAVA事件概述
    JAVA对话框事件
    各种事件汇聚
    把原来可空的列变成主键
    搜索模式中的所有表
    JAVA选项事件
  • 原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/11297136.html
Copyright © 2011-2022 走看看