Suchen Sie die Permutation eines Strings in ein anderes String-Programm


Cod29

Der Versuch, ein Programm zu erstellen, in dem nur geprüft wird, ob eine Permutation von string s1vorhanden ist string s2oder nicht.

Erstellt unter Programm und es funktioniert für unten Testfall.

Eingang:

s1 = "ab"
s2 = "eidballl"

Ausgabe:

True

Erläuterung: s2Enthält eine Permutation von s1(dh ba).

Aber diese get fehlschlagen , wenn der Eingang s2="sdfdadddbd", s1="ab", erwartet wie, falseaber bekam true .

Ich versuche herauszufinden, was hier fehlt. Verwendung eines Schiebefensteransatzes. Unter meinem Code in c#:

   public bool CheckInclusion(string s1, string s2) {

        var intCharArray = new int[256];

        foreach(char c in s1)
        {
            intCharArray[c]++;
        }

        int start=0,end=0;
        int count=s1.Length;
        bool found=false;
        while(end<s2.Length)
        {
            if (intCharArray[s2[end]]>0) { count--;}
            intCharArray[s2[end]]--;


                Console.WriteLine("end:" + end + " start:"+ start);
                if(end-start==s1.Length) {

                    if (count==0) {return true;}
                    if (intCharArray[s2[start]]>=0)
                    {
                        count++;
                    }
                    intCharArray[s2[start]]++;
                    start++;
                }
                    end++;
            }
        return false;
        }
Emma

Ich denke, die Frage ähnelt LeetCode 567 . Dies sind einfache, effiziente und von geringer Komplexität akzeptierte Lösungen:

C #

class Solution {
    public bool CheckInclusion(string s1, string s2) {
        int lengthS1 = s1.Length;
        int lengthS2 = s2.Length;

        if (lengthS1 > lengthS2)
            return false;

        int[] countmap = new int[26];

        for (int i = 0; i < lengthS1; i++)
            countmap[s1[i] - 97]++;


        int[] bCount = new int[26];

        for (int i = 0; i < lengthS2; i++) {
            bCount[s2[i] - 97]++;

            if (i >= (lengthS1 - 1)) {
                if (allZero(countmap, bCount))
                    return true;

                bCount[s2[i - (lengthS1 - 1)] - 97]--;
            }
        }

        return false;
    }

    private bool allZero(int[] s1, int[] s2) {
        for (int i = 0; i < 26; i++) {
            if (s1[i] != s2[i])
                return false;
        }

        return true;
    }
}

Java

class Solution {
    public boolean checkInclusion(String s1, String s2) {
        int lengthS1 = s1.length();
        int lengthS2 = s2.length();

        if (lengthS1 > lengthS2)
            return false;

        int[] countmap = new int[26];

        for (int i = 0; i < lengthS1; i++) {
            countmap[s1.charAt(i) - 97]++;
            countmap[s2.charAt(i) - 97]--;
        }

        if (allZero(countmap))
            return true;

        for (int i = lengthS1; i < lengthS2; i++) {
            countmap[s2.charAt(i) - 97]--;
            countmap[s2.charAt(i - lengthS1) - 97]++;

            if (allZero(countmap))
                return true;
        }

        return false;
    }

    private boolean allZero(int[] count) {
        for (int i = 0; i < 26; i++)
            if (count[i] != 0)
                return false;

        return true;
    }
}

Python

class Solution:
    def checkInclusion(self, s1, s2):
        count_map_s1 = collections.Counter(s1)
        count_map_s2 = collections.Counter(s2[:len(s1)])

        for i in range(len(s1), len(s2)):
            if count_map_s1 == count_map_s2:
                return True

            count_map_s2[s2[i]] += 1
            count_map_s2[s2[i - len(s1)]] -= 1
            if count_map_s2[s2[i - len(s1)]] == 0:
                del(count_map_s2[s2[i - len(s1)]])

        return count_map_s2 == count_map_a

Referenz

Die Codes werden unter folgenden Links erklärt:


Diese beiden Antworten sind auch nützlich, um Folgendes zu untersuchen:

Verwandte Artikel


Kopieren Sie die QPixmap eines Qlabels in ein anderes Qlabel

Ammar H Sufyan Ich versuche, ein QPixmapzu einem QLabelvon einem anderen genommenen hinzuzufügen , QLabelaber es gibt einen Fehler: Hier ist der Code const QPixmap *tempPix = new QPixmap(""); tempPix = (label1->pixmap()); label2->setPixmap(tempPix); //error c

Kopieren Sie die Daten eines Kindes mit Firebase in ein anderes

ANZEIGE Ich habe diese Funktion, mit der ich überprüfe, ob Kind A ein Kind hat, und wenn nicht, möchte ich Kind B in Kind A kopieren. Momentan versuche ich, einen Schnappschuss von B zu bekommen und ihn an A zu schreiben. Ich kann ihn nicht zum Laufen bringen.

So kopieren Sie die Elemente eines Arrays in ein anderes Array

Sanjay Sajwan Ich habe versucht, ein JavaScript-Programm zu erstellen, um einen String umzukehren, aber die Werte des Arrays bgehen nicht in das Array c. var a = window.prompt("Enter a string"); var b = a.split(""); for (var i = b.length - 1; i >= 0; i--) {

Kopieren Sie die Elemente eines Arrays in ein anderes Array

Zeyad Mohamed Dies ist mein Code, um zu versuchen, ein Array in ein Array zu kopieren, während das kopierte gedruckt wird. int arr1[10],arr2[10]; int i , n ; for(i=0; i<n; i++) { arr1[10]=arr2[10]; } printf("NOW WE WILL PRINT arr2: \n\n"); for(i=

Suchen Sie die n-te Instanz eines Strings in Notepad ++

user6833822 Ich versuche, die Funktion für reguläre Ausdrücke von Notepad ++ zu verwenden, um jede 99. Instanz der Zeichenfolge "ISA" in einem Textdokument zu finden. Ich habe versucht, den regulären Ausdruck hier zu verwenden , erhalte jedoch immer wieder den