저는 C++에서 grep 함수를 작성하고 있습니다. (실제로 할당 된 연습으로 - 실제 grep 기능이 없다는 것을 알고 있습니다.) 원래 문자열과 찾고있는 문자열을 가져옵니다. 코드에서 볼 수있는 첫 번째 공간까지 모든 문자를 grep 문자열에 입력합니다. 그런 다음 grep 문자열의 문자를 검색 문자열과 비교하고 일치하는 경우 임시 문자열에 저장합니다. grep 문자열을 반복하고 검색 문자열의 길이를 임시 문자열과 비교하여 일치하는지 확인합니다.문자열 크기를 비교하는 대신 문자를 비교할 수 있습니까?
제 질문 : 길이를 비교하는 나쁜 형태입니까? for 루프를 사용하여 각 개별 문자를 서로 비교할 수는 있지만 CPU 사이클을 불필요하게 먹는 것처럼 보입니다. 참조 용 내 입력 기능은 다음과 같습니다.
std::string grep(std::string originalStr, std::string searchStr)
{
std::string grepStr = "";
std::string finalStr = "";
//stores final string; is the return value
finalStr.resize(originalStr.length() + 1);
grepStr.resize(originalStr.length() + 1);
int place = 0;
//remember where you are in originalStr[place]
int numOfOccurences = 0;
//remember number of times searchStr was found;
//not necessary
std::string tempStr = "";
//will temporarily hold grepStr
//handles case if first occurence is a space
if (originalStr[0] == ' ')
{
place++;
}
while (place != originalStr.length())
{
tempStr = "";
while (originalStr[place] != ' ')
{
if (originalStr[place] == ' ')
{
break;
}
grepStr[place] = originalStr[place];
++place;
}
++place;//ensures you skip over the space next pass
for (int i = 0; i != grepStr.length(); i++)
{
if (grepStr[i] == searchStr[i])
{
//if they are the same, append that char..
tempStr[i] = grepStr[i];
if (tempStr.length() == grepStr.length())
//..then check for string length; if same, searchStr equals tempStr
//and you can append grepStr to the finalStr
{
for (int x = 0; x != finalStr.length(); x++)
{
finalStr[x] = grepStr[x];
}
++numOfOccurences;
//add one to the number of occurences in originalStr
finalStr += ' ';
//add a space IF you find the string
}
}
}
}
return finalStr;
}
Boyer-Moore 빠른 문자열 검색 알고리즘에 대한 링크가 매우 흥미 롭습니다. 감사합니다. –
당신이 좋아하는 것을 기쁘게 생각합니다. 정말 멋진 알고리즘입니다. 정말 꽤 직관력이 없어서 당신은 그 문자열을 빠르게 일치시킬 수 있습니다. –