leetcode-839

 

 

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

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

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

我们给出了一个不包含重复的字符串列表 A。列表中的每个字符串都是 A 中其它所有字符串的一个字母异位词。请问 A 中有多少个相似字符串组?

 

示例:

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

题目理解:通过字符串相似的定义,隐性的定义一种关系,符合的才有无向边的存在, 根据边将能能 串联到 一块的节点聚为一簇。

题目本质:深度搜索,将有关系的边找出来并加以标记 。

应用:将 有边关系的节点分别聚类找出来

问题:深度递归一次将能 递归到的全给遍历到了,for循环的则是没有递归 到的。状态的传递。 状态的传递类似于 并查集,同类同簇的同一个标记

 

 

 

class Solution {
            private boolean isSimilar(String a,String b){
        int res=0;
        for (int i=0;i<a.length();i++){
            if(a.charAt(i)!=b.charAt(i)){
                res++;
            }
        }
        return res==2|res==0;
    }

//    public boolean isSimilar(String s,String t){
//        int res = 0, i = 0;
//        while(res <= 2 && i < s.length()){
//            if(s.charAt(i) != t.charAt(i)) res++;
//            i++;
//        }
//        return res == 2;
//    }

    private void dfs(String[] a,int index,boolean[] visited,int[] flags){
//        if(visited[index]){
//            return;
//        }
        for(int i=0;i<a.length;i++){
            if(index==i| flags[i]!=-1){
                continue;
            }
            if(this.isSimilar(a[i],a[index])){
                flags[i]=flags[index];
                this.dfs(a,i,visited,flags);
                visited[i]=true;
            }
        }
    }

    public int numSimilarGroups(String[] A) {
        boolean[] visited=new boolean[A.length];
        int[] flags=new int[A.length];
        Arrays.fill(visited,false);
        Arrays.fill(flags,-1);
        for(int i=0;i<A.length;i++){
            if(flags[i]==-1){
                flags[i]=i;
            }
            this.dfs(A,i,visited,flags);
            visited[i]=true;
        }
        HashSet<Integer>  numberSet=new HashSet<>();
        for(int i=0;i<flags.length;i++){
            numberSet.add(flags[i]);
        }
        return numberSet.size();
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LeetCode-Editor是一种在线编码工具,它提供了一个用户友好的界面编写和运行代码。在使用LeetCode-Editor时,有时候会出现乱码的问题。 乱码的原因可能是由于编码格式不兼容或者编码错误导致的。在这种情况下,我们可以尝试以下几种解决方法: 1. 检查文件编码格式:首先,我们可以检查所编辑的文件的编码格式。通常来说,常用的编码格式有UTF-8和ASCII等。我们可以将编码格式更改为正确的格式。在LeetCode-Editor中,可以通过界面设置或编辑器设置来更改编码格式。 2. 使用正确的字符集:如果乱码是由于使用了不同的字符集导致的,我们可以尝试更改使用正确的字符集。常见的字符集如Unicode或者UTF-8等。在LeetCode-Editor中,可以在编辑器中选择正确的字符集。 3. 使用合适的编辑器:有时候,乱码问题可能与LeetCode-Editor自身相关。我们可以尝试使用其他编码工具,如Text Editor、Sublime Text或者IDE,看是否能够解决乱码问题。 4. 查找特殊字符:如果乱码问题只出现在某些特殊字符上,我们可以尝试找到并替换这些字符。通过仔细检查代码,我们可以找到导致乱码的特定字符,并进行修正或替换。 总之,解决LeetCode-Editor乱码问题的方法有很多。根据具体情况,我们可以尝试更改文件编码格式、使用正确的字符集、更换编辑器或者查找并替换特殊字符等方法来解决这个问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值