Strings bərabər leetcode həll etmək üçün minimum dəyişdirmə

Çətinlik səviyyəsi Mühit
Tez-tez soruşulur Amazon
alqoritmlər kodlaşdırma Görməmiş müsahibə müsahibə hazırlığı LeetCode LeetCodeSolutions SimBaxılıb 27

Problem bəyanat

Sizə iki verilir strings yalnız “x” və “y” hərflərindən ibarət bərabər uzunluqlu s1 və s2. fərqli simlərə aid hər hansı iki simvolu dəyişdirə bilərsiniz,
tapşırığınız hər iki simli bərabərləşdirməkdir. hər iki simli bərabərləşdirmək üçün tələb olunan minimum svop sayını və ya hər iki simli bərabərləşdirmək mümkün olmadıqda -1-i qaytarın.

misal

#1

s1 = "xx", s2 = "yy"
1

#2

s1 = "xy", s2 = "yx"
2

Yanaşma (açgözlü)

Hər iki dizədəki simvollara bəzi ith Index-lərinə baxsaq, cəmi 4 mümkün cüt olduqlarını görərik {s1 [i], s2 [i]}: {“x”, ”x”}, {“y , "Y"}, {"x", "y"}, {"y", "x"}.
s1 [i] cütlüyünün ilk iki növü üçün s2 [i] -ə bərabərdir (istədiyimiz budur), tələb olunan svopların sayı bu cür hallar üçün sıfır olacaqdır.

s1 [i] olan cütlərin qalan hissəsi üçün s2 [i] -ə bərabər deyil, beləliklə dəyişdirmə əməliyyatlarından istifadə etməliyik.

bundan iki şəkildə istifadə edə bilərik:

(i) hər iki i və j indeksində 3-cü (və ya 4-cü) tip cütlüyümüz varsa (i j-yə bərabər deyil), s1 [i] -i s2 [j] ilə dəyişdirsək, s1 [i] s2-yə bərabər olacaq [i] (yəni s [i] = s2 [i])
və s1 [j] s2 [j] -ə bərabər olacaq (yəni s1 [j] = s2 [j]), yəni bir hərəkətdə s1 [i] = s2 [i] və s1 [j] = s2 [ j].

Strings bərabər leetcode həll etmək üçün minimum dəyişdirmə

 

(ii) i indeksində 3-cü tip cütlük və bəzi indeksdə cütlüyün 4-cü növü varsa (və ya əksinə): {"x", "y"}, {"y", "x"}. belə ki, s1 [i] = s2 [i] və etmək
s1 [j] = s2 [j] iki dəfə dəyişdirməliyik, əvvəlcə s1 [i] s2 [i] ilə dəyişdirməliyik, indi cütlər belə olacaq: {“y”, ”x”}, {“y, ”X”}. indi s1 [i] s2 [j] ilə dəyişdirməliyik və əldə edəcəyik
s1 [i] = s2 [i] və s1 [j] = s2 [j].

 

Strings bərabər leetcode həll etmək üçün minimum dəyişdirmə

 

Gördüyümüz kimi (i) tipli əməliyyat iki indeksin hesablanması üçün yalnız 1 hərəkət tələb edir, buna görə də (i) tip əməliyyatları bacardığımız qədər etməyə çalışacağıq. hamısını asanlıqla əldə edə bilərik
cüt növləri. Deyək ki, {"x", "y"} cüt sayını = n1, {"y", "x"} cüt sayını = n2 əldə edirik.
2 dəyişdirmə tip 3 cütlüyünü bir mübadilədə həll edə bilərik. beləliklə n1 cütü həll etməli olduğumuz ümumi mübadilə n1 / 2 olacaqdır, əgər n1 tək olarsa bir cüt həll olunmamış qalacaq.

Eynilə n2 üçün. n1 və n2 ikisi də təkdirsə, hər birindən bir cüt həll ediləcək, belə ki onları həll etmək üçün 2 dəyişdirmə tələb edən (ii) tipli əməliyyatdan istifadə edə bilərik.
əks halda, n1 və n2 cütlüyü eyni deyilsə (yəni n1 təkdir və n2 cütdürsə) həll olunmamış bir cüt əldə edəcəyik,
bu vəziyyətdə ipləri bərabərləşdirmək qeyri-mümkün olacaqdır.

Həyata keçirilməsi

Sətirləri bərabər Leetcode həllinə çevirmək üçün minimum svoplar üçün C ++ proqramı

#include<bits/stdc++.h>
using namespace std;
int minimumSwap(string s1, string s2) 
{
    int xy_count=0,//count of {x,y} pairs
    yx_count=0,//count of {y,x} pairs
    n=s1.length();
    for(int i=0;i<n;i++)
    {
        if(s1[i]!=s2[i])
        {
            if(s1[i]=='x') xy_count++;
            else yx_count++;
        }
    }
    if(xy_count%2==yx_count%2) return (xy_count+yx_count)/2+(xy_count%2==1);//if parity of count of xy pair and yx pair is same 
    else return -1;
}

int main()
{
    string s1="xxxyy",s2="yyxxx";
    cout<<minimumSwap(s1,s2);
    return 0;
}
2

Strings bərabər leetcode həll etmək üçün minimum dəyişdirmə üçün Java proqramı

class Rextester{
    
      public static int minimumSwap(String s1, String s2) 
      {
         
        int xy_count=0,//count of {x,y} pairs
        yx_count=0,//count of {y,x} pairs
        n=s1.length();
        for(int i=0;i<n;i++)
        {
            if(s1.charAt(i)!=s2.charAt(i))
            {
                if(s1.charAt(i)=='x') xy_count++;
                else yx_count++;
            }
        }

        //if parity of count of xy pair and yx pair is same 
        if(xy_count%2==yx_count%2) return (xy_count+yx_count)/2+((xy_count%2==1)?1:0);
        else return -1;
    }
    
    public static void main(String args[])
    {
       	String s1="xxxyy",s2="yyxxx";
        System.out.println(minimumSwap(s1,s2) );
    }
}
2

Simləri bərabər leetcod həllinə çevirmək üçün minimum svoplar üçün mürəkkəblik analizi

Zamanın mürəkkəbliyi

O (n): Harada n simin uzunluğudur. Hər iki simi təkcə təkrarladığımız üçün zaman mürəkkəbliyi O (n) olacaqdır.

Kosmik Mürəkkəblik

O (1): Əlavə yer istifadə etmirik.

Şərh yaz

Translate »
1