Erkennen von Anagrammen in einer übergeordneten Zeichenfolge

9

Bei zwei Zeichenfolgen, einer übergeordneten Zeichenfolge und einer Abfragezeichenfolge, müssen Sie bestimmen, wie oft die Abfragezeichenfolge oder ein Anagramm der Abfragezeichenfolge verwendet werden soll . wird in der übergeordneten Zeichenfolge bei einer Suche mit Groß- und Kleinschreibung angezeigt.

Beispiele für Verhalten

Eingabe 1

AdnBndAndBdaBn
dAn

Ausgabe 1

4

Erläuterung Die Teilzeichenfolgen sind unten fett hervorgehoben:

Adn BndAndBdaBn

AdnB ndA ndBdaBn

AdnBn dAn dBdaBn

AdnBnd und BdaBn

Beachten Sie, dass bei der Suche bei allen Suchvorgängen zwischen Groß- und Kleinschreibung unterschieden werden muss.

Eingabe 2

AbrAcadAbRa
cAda

Ausgabe 2

2

Dies muss nur für Standard-ASCII funktionieren. Dies ist Code-Golf, daher wird die kürzeste Anzahl von Zeichen genehmigt. Bitte posten Sie auch eine nicht Golfversion Ihres Codes zusammen mit der Golfversion.

WallyWest
quelle
2
Wichtiger Testfall:abacacaba aac
Martin Ender
Ist die übergeordnete Zeichenfolge immer länger als die Abfragezeichenfolge?
Optimierer
Oh sehr guter Punkt! Ja @Optimizer, die übergeordnete Zeichenfolge ist immer länger als die Abfragezeichenfolge.
WallyWest
@WallyWest Was ist mit dem zusätzlichen Testfall? Sollten überlappende Vorkommen einer einzelnen Permutation gezählt werden?
Martin Ender
1
Können Sie einen Testfall und die richtige Lösung für Ihren letzten Kommentar angeben?
isaacg

Antworten:

5

Pyth, 11 10 Bytes

lfqSzST.:w

1 Byte Golf dank @Jakube.

Demonstration.

Nimmt die Abfragezeichenfolge, gefolgt von der übergeordneten Zeichenfolge in einer neuen Zeile.

Ungolfed:

z = input()
len(filter(lambda T: sorted(z) == sorted(T), substrings(input())
isaacg
quelle
1 Byte speichern, einfach das letzte Zeichen Ihrer Lösung entfernen
;-)
@ Jakube Oh, natürlich ist das wunderbar.
isaacg
3

CJam, 13 Bytes

le!lf{\/,(}:+

(12 Bytes, wenn Überlappung erlaubt ist)

l$_,lew:$\e=

Die Eingabe lautet wie folgt:

dAn
AdnBndAndBdaBn

dh

<query string>
<parent string>

Vielen Dank an Dennis für das Speichern von 3 Bytes im überlappenden Szenario

Probieren Sie es hier online aus

Optimierer
quelle
1
Sie können Überlappungen mit der gleichen Anzahl von Bytes behandeln:ll1$,ew:$\$e=
Dennis
@ Tennis Das ist wirklich schön. 12 Bytes: l$_,lew:$\e=Aber nicht sicher, ob dies jetzt gültig ist, da OP gesagt hat, dass Überlappungen nicht zulässig sind. Lassen Sie mich sehen, ob ich meine aktuelle reduzieren kann.
Optimierer
2

JavaScript ES6, 95 Byte

f=(p,q,n=0,s=a=>[...a].sort().join(''))=>[...p].map((_,i)=>n+=s(p.substr(i,q.length))==s(q))&&n

Dies ist eine Funktion, die zwei Argumente wie folgt akzeptiert : f(parent,query).

Es durchläuft alle Teilzeichenfolgen der übergeordneten Zeichenfolge mit der Länge der Abfragezeichenfolge und sortiert sie. Wenn sie mit der sortierten Abfragezeichenfolge identisch sind, wird sie erhöht n. Das Sortieren von Zeichenfolgen ist ärgerlich, da sie in ein Array konvertiert, sortiert und wieder in eine Zeichenfolge konvertiert werden müssen. Ungolfed und testbarer Code unten.

var f = function(p, q) {
  var n = 0
  var s = function(a) {
    return a.split('').sort().join('')
  }
  
  p.split('').map(function(_, i) {
    n += s(p.substr(i, q.length)) == s(q)
  })
  return n
}

// testing code below
document.getElementById('go').onclick = function() {
  var parent = document.getElementById('parent').value,
    query = document.getElementById('query').value;
  document.getElementById('output').innerHTML = f(parent, query);
}
<label>Parent: <input id="parent" value="AdnBndAndBdaBn"/></label><br />
<label>Query:  <input id="query" value="dAn"/></label><br />
<button id="go">Go</button><br />
<samp id="output">&mdash;</samp> anagrams found

NinjaBearMonkey
quelle
2

Haskell, 77 68 Bytes

import Data.List
p#s=sum[1|x<-tails p,sort s==sort(take(length s)x)]

Verwendungszweck:

*Main> "AdnBndAndBdaBn" # "dAn"
4
*Main> "AbrAcadAbRa" # "cAda"
2
*Main> "abacacaba"# "aac"
2

So funktioniert es: Übergeordnete Zeichenfolge ist p, Abfragezeichenfolge ist s.

tails Erstellt eine Liste seiner Parameter, wobei nacheinander das erste Element entfernt wird, z tails "abcd" -> ["abcd","bcd","cd","d",""] . xNehmen Sie für jedes Element dieser Liste ein, 1wenn die sortierten ersten nElemente (wobei ndie Länge von ist s) gleich den sortierten sind s. Summiere die 1s.

Bearbeiten: tailsstatt expliziter Rekursion

Nimi
quelle
2

Python, 61 Bytes

s=sorted
f=lambda a,b:a>''and(s(b)==s(a[:len(b)]))+f(a[1:],b)

Dies ist ein rekursiver Algorithmus. Es wird geprüft, ob die Anfangszeichen der übergeordneten Zeichenfolge nach dem Sortieren mit der sortierten Abfragezeichenfolge übereinstimmen. Dann rekursiv auf der übergeordneten Zeichenfolge, wobei das erste Zeichen entfernt wird. Es wird beendet, wenn die übergeordnete Zeichenfolge leer ist.

isaacg
quelle
2

Python 2, 76 70 Bytes

Diese Lambda-Funktion vergleicht iterativ jeden sortierten Teilstring mit dem Ziel-Teilstring. Die Übereinstimmungen werden gezählt und zurückgegeben.

lambda a,d:sum(sorted(d[n:n+len(a)])==sorted(a)for n in range(len(d)))

Der Code ohne Wolf:

f = lambda substr, text: sum(
    sorted(text[n:n+len(substr)]) == sorted(substr)
    for n in range(len(text))
    )

def test(tests):
    for t in tests.split():
        substr, text  = t.split(',')
        print t, f(substr, text)

tests = '''ba,abcba dAn,AdnBndAndBdaBn aac,abacacaba'''
test(tests)

und die Testausgabe:

ba,abcba 2
dAn,AdnBndAndBdaBn 4
aac,abacacaba 2
Logikritter
quelle
ZOUNDS! Das habe ich nie gesehen. Ich werde einige Bytes bearbeiten und speichern. Danke Jakube.
Logic Knight
2

Python 2, 124 118 Bytes

Probieren Sie es hier aus

Dies ist eine anonyme Lambda-Funktion. Es kann wahrscheinlich noch weiter Golf gespielt werden.

import re,itertools as i
lambda p,q:sum(len(re.findall('(?='+''.join(i)+')',p))for i in set(i.permutations(q,len(q))))

Ungolfed:

from itertools import*
import re
def f(p,q):
    c=0
    for i in set(permutations(q,len(q))):
        c+=len(re.findall('(?='+''.join(i)+')',p))
    print c
mbomb007
quelle
Sie brauchen nicht re, Sie können einfach string.count (Teilzeichenfolge) für jede Permutation
ausführen
2
@sirpercival Nein, string.cound zählt keine überlappenden Vorkommen wie in der f('aaa','aa').
Jakube
Ah, guter Anruf! ich habe das vergessen.
Sirpercival
1
import re,itertools as ispart 6 Zeichen. (Ich habe vorher nicht gewusst, dass es funktioniert.)
randomra