Dize arama algoritması, daha büyük bir metinde(dize) belirli bir modelin(alt dize) oluşumlarını bulmak için kullanılır. Bu algoritma, metin işleme, arama ve değiştirme görevlerinde çok önemli bir rol oynar.
Nasıl çalışır
- Aranacak bir metin(dize) ve bir kalıp(alt dize) ile başlayın.
- Metin boyunca her seferinde bir karakter yineleyin.
- Metindeki her karakter için, kalıbın ilk karakteriyle karşılaştırın.
- Bir eşleşme varsa, sonraki karakterlerin de kalıpla eşleşip eşleşmediğini kontrol edin.
- Model tamamen eşleşirse, eşleşmenin başlangıç konumunu kaydedin.
- Metinde kalıbı aramaya devam edin.
Örnek
Bir metin düşünün: "ababcababcabcabc" Ve bir kalıp: "abc"
- 0 konumundan başlayın. "a"yı modeldeki ilk "a" karakteriyle karşılaştırın.
- Eşleşme bulundu, sonraki karakterlere geçin: "b" ile "b" ve "a" ile "c".
- Eşleştirmeye devam edin: "b" ile "a", "a" ile "b" ve "b" ile "c".
- Maç 2. pozisyonda başarısız oldu.
- 3. konumdan yeniden başlayın. "a"yı modeldeki ilk "a" karakteriyle karşılaştırın.
- Başarılı eşleştirme: "a" ile "a", "b" ile "b" ve "c" ile "c".
- Kayıt konumu 3.
"abc" modeli 0, 6 ve 9 konumlarında bulunur.
C++'da Örnek Kod
#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;
}
Bu örnekte stringSearch
işlev, "abc" kalıbının "ababcababcabcabc" metni içinde geçtiği yerleri bulmak için kullanılır. Sonuç, maçların başlangıç konumlarını içeren bir vektör olacaktır.