Merkkijonohakualgoritmia käytetään tietyn kuvion(osamerkkijonon) esiintymien etsimiseen suuremmasta tekstistä(merkkijonosta). Tällä algoritmilla on ratkaiseva rooli tekstinkäsittely-, haku- ja käsittelytehtävissä.
Kuinka se toimii
- Aloita etsittävällä tekstillä(merkkijono) ja kuviolla(osamerkkijono).
- Toista tekstiä yksi merkki kerrallaan.
- Vertaa jokaista tekstin merkkiä kuvion ensimmäiseen merkkiin.
- Jos vastaavuus löytyy, tarkista, vastaavatko myös seuraavat merkit kuviota.
- Jos kuvio on täysin yhteensopiva, kirjaa ottelun aloitussijainti.
- Jatka kuvion etsimistä tekstistä.
Esimerkki
Harkitse tekstiä: "ababcababcabcabc" ja kuviota: "abc"
- Aloita paikasta 0. Vertaa "a" kuvion ensimmäiseen merkkiin "a".
- Vastaavuus löydetty, siirry seuraaviin merkkeihin: "b" ja "b" ja "a" ja "c".
- Jatka yhdistämistä: "b":llä "a", "a"b":llä ja "b":llä "c".
- Ottelu epäonnistui sijainnissa 2.
- Aloita uudelleen kohdasta 3. Vertaa "a" kuvion ensimmäiseen merkkiin "a".
- Onnistunut ottelu: "a" kirjaimella "a", "b" kirjaimella "b" ja "c" kirjaimella "c".
- Äänityspaikka 3.
Kuvio "abc" löytyy paikoista 0, 6 ja 9.
Esimerkkikoodi C++:ssa
#include <iostream>
#include <string>
#include <vector>
std::vector<int> stringSearch(const std::string& text, const std::string& pattern) {
std::vector<int> positions;
for(int i = 0; i <= text.length()- pattern.length(); ++i) {
int j = 0;
while(j < pattern.length() && text[i + j] == pattern[j]) {
++j;
}
if(j == pattern.length()) {
positions.push_back(i);
}
}
return positions;
}
int main() {
std::string text = "ababcababcabcabc";
std::string pattern = "abc";
std::vector<int> result = stringSearch(text, pattern);
std::cout << "Pattern found at positions: ";
for(int pos: result) {
std::cout << pos << ";
}
std::cout << std::endl;
return 0;
}
Tässä esimerkissä stringSearch
funktiota käytetään etsimään kuvion "abc" esiintymiä tekstistä "ababcababcabcabc". Tuloksena on vektori, joka sisältää otteluiden aloituspaikat.