En double-conclusion de texte
-
21-08-2019 - |
Question
Mon problème principal essaie de trouver une solution adaptée pour tourner automatiquement ce, par exemple:
d+c+d+f+d+c+d+f+d+c+d+f+d+c+d+f+
dans ceci:
[d+c+d+f+]4
i.e.. Trouver les doublons à côté de l'autre, puis faire une « boucle » plus courte de ces doublons. Jusqu'à présent, je l'ai trouvé aucune solution adaptée à cela, et je me réjouis d'une réponse. Post-scriptum Pour éviter toute confusion, l'échantillon ci-dessus n'est pas la seule chose qui a besoin « en boucle », il diffère d'un fichier à. Oh, et cela est destiné à un programme C ++ ou C #, que ce soit est très bien, mais je suis ouvert à d'autres suggestions aussi. En outre, l'idée principale est que tout le travail serait fait par le programme lui-même, aucune entrée d'utilisateur, sauf pour le fichier lui-même. Voici le dossier complet, pour référence, mes excuses pour la page Étiré: # 0 @ 16 V225 Y10 W250 t76
L16
$ ED $ EF $ A9
p20,20
> Ecegb> d
/
L8
R1R1R1R1
f + f + g + r4 + cg
a + c + a + g + + cg R4f + f + g + r4 + cg
a + c + a + g + + cg R4f + f + g + r4 + cg
a + c + a + g + r4 + cg
f + f + g + r4 + cg
a + c + a + g + + R4G 16f16c +
a + 2 ^ g + f + g + 4
f ff + + + f4 4FD
d + c + d + 4c + c C4d +
# 4 @ 22 Y10 de V250
L8 o3 rg rg + + + rg rg rg + + + rg rg rg + + + rg rg rg + + + rg rg rg + + + rg rg rg + + + rg rg rg + + + rg rg rg + + + rg / r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1
# 2 @ 4 Y10 de V155
L8 $ ED $ F8 $ 8F O4 r1r1r1 d + 4f4f + 4g + 4 a + 4R1 ^ 4 ^ 2 / d + 4 ^ fr2 f + 4 ^ 4 ^ fr2d + fr2 f + 4 ^ 4 ^ fr2d + fr2 f + 4 ^ 4 ^ fr2d + fr2 f + 4 ^ fr2 > d + 4 ^ fr2 f + 4 ^ 4 ^ fr2d + fr2 f + 4 ^ fr2 < f + g + 4 ^ r2 f + 4 ^ 4 ^ fr2f + g + r2 f + 4 ^ 4 ^ fr2f + g + r2 f + 4 ^ 4 ^ fr2f + g + r2 f + 4 ^ 4 ^ fr2f + g + r2 f + 4 ^ 4 ^ fr2f + g + r2 f + 4 ^ 4 ^ fr2f + g + r2 f + 4 ^ 4 ^ fr2f + g + r2 f + 4 ^ fr2 > a + g + 4 ^ r2 f + 1a + 4 ^ g + r2 f + 1 f + 4 ^ fr2 d + 1 f + 4 ^ fr2 d + 2 ^ d ^ + 4 r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1
# 3 @ 10 Y10 V210
r1 ^ 1
o3
c8r8d8r8
c8r8c8r8c8r8c8r8c8r8c8r8c8r8c8r8c8r8c8r8c8r8
c8
@ 10d16d16 @ 21
c8
@ 10d16d16 @ 21
c8
@ 10d16d16 @ 21
/
c4 @ 10D8 @ 21c8 # 7 @ 16 Y10 de V230 L16
$ ED $ EF $ A9
cceeggbbggeeccee
# 5 @ 4 Y10 de V155 L8
$ ED $ F8 $ 8FO4
R1R1R1R1
d + 4R1 ^ 2 ^ 4
/
CR2
c + 4 ^ a2 cr2
c + 4 ^ a2 cr2
c + 4 ^ a2 cr2
c + 4 ^ cr2
a + 4 ^> cr2
c + 4 ^ cr2
CR2
c + 4 c ^
r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1
r2
f + 4 ^ fr2
d + 1F + 4 ^ fr2
d + 1
c + 4 ^ cr2
C + 4 ^ cr2
La solution
Je ne sais pas si cela est ce que vous recherchez.
Je pris la chaîne "testtesttesttest4notaduped + c + d + f + d + c + d + f + d + c + d + f + d + c + d + f + testtesttest" et converti en « [Test] 4 4notadupe [d + c + d + f +] 4 [Test] 3 «
Je suis sûr que quelqu'un va trouver une meilleure solution plus efficace car il est un peu lent lors du traitement de votre dossier complet. Je me réjouis d'autres réponses.
string stringValue = "testtesttesttest4notaduped+c+d+f+d+c+d+f+d+c+d+f+d+c+d+f+testtesttest";
for(int i = 0; i < stringValue.Length; i++)
{
for (int k = 1; (k*2) + i <= stringValue.Length; k++)
{
int count = 1;
string compare1 = stringValue.Substring(i,k);
string compare2 = stringValue.Substring(i + k, k);
//Count if and how many duplicates
while (compare1 == compare2)
{
count++;
k += compare1.Length;
if (i + k + compare1.Length > stringValue.Length)
break;
compare2 = stringValue.Substring(i + k, compare1.Length);
}
if (count > 1)
{
//New code. Added a space to the end to avoid [test]4
//turning using an invalid number ie: [test]44.
string addString = "[" + compare1 + "]" + count + " ";
//Only add code if we are saving space
if (addString.Length < compare1.Length * count)
{
stringValue = stringValue.Remove(i, count * compare1.Length);
stringValue = stringValue.Insert(i, addString);
i = i + addString.Length - 1;
}
break;
}
}
}
Autres conseils
Vous pouvez utiliser l'algorithme de Smith-Waterman pour faire l'alignement local, comparant la chaîne contre lui-même.
http://en.wikipedia.org/wiki/Smith-Waterman_algorithm
EDIT: Pour adapter l'algorithme d'auto-alignement, vous devez forcer des valeurs dans la diagonale à zéro - à savoir, pénaliser la solution triviale d'aligner toute la chaîne exactement avec lui-même. Ensuite, la « deuxième meilleur » alignement ressortira à la place. Ce sera la plus longue de deux sous-chaînes correspondants. Répétez le même genre de chose à trouver des sous-chaînes correspondant plus en plus courts.
LZW peut aider: il utilise préfixes dictionnaire pour rechercher des motifs répétitifs et remplace ces données avec des références aux entrées précédentes. Je pense qu'il ne devrait pas être difficile de l'adapter à vos besoins.
Pourquoi ne pas simplement utiliser System.IO.Compression ?