C++程序 查找给定数字字符串所需的最小循环旋转次数,避免给定字符串集合
在程序开发中,我们经常需要对字符串进行操作。本篇文章将分享一个C++程序,它可以查找给定数字字符串所需的最小循环旋转次数,并避免给定的字符串集合。
代码实现
以下是程序的实现过程:
- 编写一个函数,用于检查两个字符串是否相等。
bool equal(std::string s1, std::string s2) { return (s1.size() == s2.size()) && (s1 + s1).find(s2) != std::string::npos; }
函数中使用了
std::string
类的方法,size()
返回字符串长度,+
表示字符串拼接,find()
可以在一个字符串中查找子串,它返回第一次出现的位置或std::string::npos
。它的实现原理是比较两个字符串是否相等。由于是循环旋转,我们可以把
s1
拼接一遍再查找s2
,如果找不到,说明s1
和s2
是不同的串。 -
接下来是求出最小循环旋转次数的函数。
int min_rotation(std::vector<std::string> strings, std::string target) { int n = strings.size(); int left = 0, right = n - 1; while (left < right) { int mid = (left + right) / 2; if (strings[mid] < target) left = mid + 1; else right = mid; } if (equal(strings[left], target)) return left; else return -1; }
函数中使用了二分查找法。首先将字符串数组进行排序,然后用二分法查找目标字符串的索引。接下来,我们检查该字符串是否等于目标字符串。如果是,我们就找到了目标字符串在数组中的索引,直接返回即可。否则,返回-1。
-
最后是主函数进行测试。
int main() { std::vector<std::string> strings{"12345", "34512", "51234"}; std::string target{"34512"}; int pos = min_rotation(strings, target); if (pos != -1) std::cout << "The minimal rotation needed is " << pos << "." << std::endl; else std::cout << "The target string is not in the array." << std::endl; return 0; }
在主函数中,我们定义了一个字符串数组
string
和一个目标字符串target
。接下来,我们调用min_rotation
函数得到目标字符串的最小旋转次数,然后根据返回值判断结果是在数组中还是不存在。
结论
本文分享了一个C++程序,用于查找给定数字字符串所需的最小循环旋转次数,避免给定字符串集合。我们可以根据该程序实现一些字符串相关的算法。