Unikal Simvollarla Birləşdirilmiş Sətin Maksimum Uzunluğu Leetcode Həlli

Çətinlik səviyyəsi Mühit
Tez-tez soruşulur Amazon American Express microsoft Kahin Tesla
Geyim Bit manipulyasiya SimBaxılıb 20

Problem bəyanat

The Bənzərsiz simvollarla birləşdirilmiş sətirin maksimum uzunluğu LeetCode Həlli – “Unikal simvollarla birləşdirilmiş sətirin maksimum uzunluğu” deyir ki, sizə bir sıra sətirlər verilir və siz seçmək lazımdır hər hansı bir ardıcıllıq verilmiş massivdən seçin və yalnız ehtiva etməli olan yeni sətir yaratmaq üçün həmin sətirləri birləşdirin unikal simvol. Etməliyik uzunluğu maksimuma çatdırın uyğun alt ardıcıllığın seçilməsi ilə yaradılmış yeni sətirdən.

Qeyd: 1<=arr.length<=16

Misal:

Unikal Simvollarla Birləşdirilmiş Sətin Maksimum Uzunluğu Leetcode HəlliPin

 

Input:  arr = ["un","iq","ue"]
Output: 4

Explanation:

  • Verilmiş giriş massivinin ölçüsü 3-ə malikdir.
  • Verilmiş massivin bütün alt ardıcıllıqlarını nəzərdən keçirin.
  • [“”,”ue”,”iq”,”ique”,”un”,”unue”,”uniq”,”unique”] verilmiş giriş massivinin alt ardıcıllıqlarıdır.
  • Biz asanlıqla müşahidə edə bilərik ki, 1,2,3,4,5,7-də olan sətirlər etibarlı sətirlərdir (yalnız unikal simvollardan ibarət sətirlər).
  • Beləliklə maksimum uzunluq bütün etibarlı sətirlər arasında 4-dür.
Input:  arr = ["cha","r","act","ers"]
Output: 6

Explanation:

  • Etibarlı sətirin maksimum uzunluğu 6-dır.
  • Etibarlı uzunluq kimi 6 verən mümkün ardıcıllıqlardan biri belədir: “cha” + “ers” = “charers”

Yanaşma

Idea:

  1. Bu problemi həll etmək üçün əsas fikir düşünməkdir bütün mümkün alt çoxluqlar istifadə edərək giriş massivinin Bitmasking (n<=16-dan bəri).
  2. Maska arr[i]-nin görünüşünü təmsil etsin, maskanın i-ci biti = 1 o deməkdir ki, ardıcıllıqda arr[i] var.
  3. Cəmi var 2^n bitmasking vəziyyəti 0-dan başlayaraq (2^n – 1) bizim ola biləcəyimiz hər bir mümkün alt çoxluğu təmsil edir.
  4. Giriş massivinin hər bir alt çoxluğu üçün onun a təşkil edib-etmədiyini yoxlayırıq etibarlı sətir?. Əgər formalaşa bilsə, biz edəcəyik maksimum uzunluğu yeniləyin indiyə qədər.
  5. Nəzərə alın ki, nəticə sətrini yoxlayaraq etibarlı sətir yaratmaq üçün seçilmiş alt çoxluqların yalnız olub olmadığını yoxlayacağıq. fərqli xarakterlər.

Kodu

C++ Həlli:

class Solution {
public:
    bool NoDuplicate(int& found,string s){
        for(auto& c:s){
            int pos = c-'a';
            if((1<<pos)&found){
                return false;
            }
            found |= (1<<pos);
        }
        return true;
    }
    int maxLength(vector<string>& arr) {
        int ans = 0,n = arr.size();
        for(int mask=0;mask<(1<<n);mask++){
            int len = 0,ok = 1,found = 0;
            for(int i=0;i<n and ok;i++){
                if((1<<i)&mask){
                    if(!NoDuplicate(found,arr[i])){
                        ok = 0;
                    }
                    else{
                        len += arr[i].length();
                    }
                }
            }
            if(ok){
                ans = max(ans,len);
            }
        }
        return ans;
    }
};

Java Həlli:

class Solution {
    int found;
    private int NoDuplicate(String s){
        for(int i=0;i<s.length();i++){
            int pos = s.charAt(i)-'a';
            if(((1<<pos)&found)>0){
                return 0;
            }
            found += (1<<pos);
        }
        return 1;
    }
    public int maxLength(List<String> arr) {
        int ans = 0,n = arr.size();
        for(int mask=0;mask<(1<<n);mask++){
            found = 0;
            int len = 0,ok = 1;
            for(int i=0;i<n&&(ok>0);i++){
                if(((1<<i)&mask)>0){
                    if(NoDuplicate(arr.get(i))==0){
                        ok = 0;
                        break;
                    }
                    else{
                        len += arr.get(i).length();
                    }
                }
            }
            if(ok==1){
                ans = Math.max(ans,len);
            }
        }
        return ans;
    }
}

Unikal simvollarla birləşdirilən sətirin maksimum uzunluğu üçün mürəkkəblik təhlili Leetcode həlli

Zamanın mürəkkəbliyi

Yuxarıdakı kodun zaman mürəkkəbliyi O(N * 2^N). Bit maskalanmasından istifadə edərək bütün mümkün alt çoxluqları yaradırıq, buna görə də 2^N faktoru gəlir. Həmçinin, hər bir alt çoxluq üçün biz bütün giriş massivində təkrar edirik, bu səbəbdən O(N * 2^N) olarsa, ümumi mürəkkəblik yaranır.

Kosmik Mürəkkəblik

Yuxarıdakı kodun kosmik mürəkkəbliyi O (1) çünki biz yalnız daimi boşluqdan istifadə edirik.

Referans: https://en.wikipedia.org/wiki/Bit_manipulation

Translate »