LeetCode990。方程式の満足度

トピック

変数間の関係を表す文字列方程式の配列が与えられると、各文字列方程式方程式[i]の長さは4で、「a == b」または「a」の2つの異なる形式のいずれかを取ります。 != b "。ここで、aとbは小文字(必ずしも異なる必要はありません)であり、1文字の変数名を表します。
与えられたすべての方程式を満たすために整数を変数名に割り当てることができる場合にのみ、trueを返します。それ以外の場合はfalseを返します。
リンク

アイデア

  • コレクションの確認方法がわかりません。聞いたことがあるはずですが、書き込めません。解決策を読んだ後は、人形(/ dog)のように感じます。
  • アイデアは実際には優れています。方程式は推移的です。同じグループがグループ化されます。最後に、不等式をトラバースして、前の方程式で渡された等しい結果に従って矛盾していないかどうかを調べます。
    重要なのは、グループ化する方法と、それらが同じセットに属することを確認する方法です。この結合されたデータ構造はより便利です(無知の涙を流します)。
  • ユニオンクエリセットは配列によって実装されます。添え字の値はノードの値を表し、配列の値は親ノードに格納されます(ツリーによる場合、実際には、これらはルートノードを接続する中間ノードであり、同じセットに属していることを表します。 、値と添え字を連結することにより、この質問は方程式の両側に小文字を使用するため、長さ26の配列に格納されます。最初にすべての方程式をトラバースし、等しいものをセットにマージしてから、不等式をトラバースして矛盾を判断します。
    Weiwei兄貴の詳細な問題解決
class Solution {
    
    
    private int[]parent=new int[26];
    public boolean equationsPossible(String[] equations) {
    
    
        for(int i=0;i<26;i++){
    
    
            parent[i]=i;
        }
        for(String s:equations){
    
    
            char[]cs=s.toCharArray();
            if(cs[1]=='='){
    
    
                union(cs[0]-'a',cs[3]-'a');
            }
        }
        for(String s:equations){
    
    
            char[]cs=s.toCharArray();
            if(cs[1]=='!'){
    
    
                if(find(cs[0]-'a')==find(cs[3]-'a')){
    
    
                    return false;
                }
            }
        }
        return true;
    }

    private void union(int idx1,int idx2){
    
    
    	//这个地方,归并到谁都行,只要idx1和idx2属于一个集合
        parent[find(idx2)]=find(idx1);
    }
	//查找idx的根节点
    private int find(int idx){
    
    
        while(parent[idx]!=idx){
    
    
        	//隔代路径压缩,详细参考大佬题解
            parent[idx]=parent[parent[idx]];
            idx=parent[idx];
        }
        return idx;
    }
}

おすすめ

転載: blog.csdn.net/qq_42007742/article/details/106615904