zoukankan      html  css  js  c++  java
  • 839. 相似字符串组

    如果交换字符串 X 中的两个不同位置的字母,使得它和字符串 Y 相等,那么称 X 和 Y 两个字符串相似。如果这两个字符串本身是相等的,那它们也是相似的。

    例如,"tars" 和 "rats" 是相似的 (交换 0 与 2 的位置); "rats" 和 "arts" 也是相似的,但是 "star" 不与 "tars""rats",或 "arts" 相似。

    总之,它们通过相似性形成了两个关联组:{"tars", "rats", "arts"} 和 {"star"}。注意,"tars" 和 "arts" 是在同一组中,即使它们并不相似。形式上,对每个组而言,要确定一个单词在组中,只需要这个词和该组中至少一个单词相似。

    给你一个字符串列表 strs。列表中的每个字符串都是 strs 中其它所有字符串的一个字母异位词。请问 strs 中有多少个相似字符串组?

    示例 1:

    输入:strs = ["tars","rats","arts","star"]
    输出:2
    

    示例 2:

    输入:strs = ["omv","ovm"]
    输出:1
    

    提示:

    • 1 <= strs.length <= 100
    • 1 <= strs[i].length <= 1000
    • sum(strs[i].length) <= 2 * 104
    • strs[i] 只包含小写字母。
    • strs 中的所有单词都具有相同的长度,且是彼此的字母异位词。

    备注:

          字母异位词(anagram),一种把某个字符串的字母的位置(顺序)加以改换所形成的新词。

    写出一个isSimilar()函数之后就是套模板啦

    class Solution {
        private int[] f;
    
        private boolean isSimilar(String a,String b){
            int different=0;
            for(int i=0;i<a.length();i++){
                if(a.charAt(i)!=b.charAt(i))
                    different++;
            }
            if(different==2||different==0)return true;
            else return false;
        }
    
        private int find(int x){
            if(x==f[x])return x;
            return f[x]=find(f[x]);   
        }
    
        public int numSimilarGroups(String[] strs) {
            int res=0;
            int n=strs.length;
            f=new int[n];
    
            for(int i=0;i<n;i++){
                f[i]=i;
            }
    
            for(int i=0;i<n;i++){
                for(int j=0;j<n;j++){
                    if(isSimilar(strs[i],strs[j])){
                        int x=find(f[i]);
                        int y=find(f[j]);
                        if(x!=y)f[x]=y;
                    }
                }
            }
    
            boolean[] flag=new boolean[n];
            for(int i=0;i<n;i++){
                int index=find(f[i]);
                if(!flag[index])res++;
                flag[index]=true;
            }
    
            return res;
        }
    }
  • 相关阅读:
    LeetCode题解(2)-- Add Two Numbers
    LeetCode题解(1)--Two Sum
    STL review:vector & string & map & struct
    机器学习导论(一) 基本概念
    Single Number
    Single Number II
    Copy List with Random Pointer
    Word Break
    Populating Next Right Pointers in Each Node II
    Binary Tree Inorder Traversal
  • 原文地址:https://www.cnblogs.com/xxxsans/p/14351718.html
Copyright © 2011-2022 走看看