c++遍历字符串的所有子字符串
时间: 2024-12-10 10:49:44 浏览: 36
在C++中,遍历字符串的所有子字符串可以采用多种方法,包括滑动窗口法和迭代。这里以滑动窗口法为例,这种方法通过改变开始和结束索引来获取不同长度的子串。
以下是一个简单的函数,它会生成给定字符串的所有非空子字符串:
```cpp
#include <string>
void generateSubstrings(std::string str) {
int length = str.length();
for (int i = 0; i < length; i++) { // 开始位置
for (int j = i + 1; j <= length; j++) { // 结束位置
std::cout << str.substr(i, j - i) << " ";
}
}
}
int main() {
std::string str = "Hello, World!";
generateSubstrings(str);
return 0;
}
```
在这个例子中,`substr(i, j - i)`函数用于从原始字符串`str`中提取子字符串,从索引`i`开始,长度为`j - i`。外层循环控制开始位置,内层循环控制结束位置,从而覆盖所有可能的子字符串。
注意,这个函数会产生重复的子串,如对于字符串"abc",会输出"a", "ab", "abc", "b", "bc", "c"。如果只关心无重复的子串,可以在内部循环之前检查当前子串是否已存在。
相关问题
写一段c++程序:给定二叉树在两个字符串中的预序遍历和无序遍历的输出,请设计一种算法来创建二叉树并打印该树的后序遍历字符串。 输入:两个字符串,一个是预序遍历的输出,另一个是二叉树的无序遍历的输出。 输出:树的后置遍历字符串。
在C++中,我们可以使用递归的方式来解决这个问题。首先我们需要定义一个二叉树节点结构体,并且需要处理预序遍历和无序遍历之间的转换。然后我们编写一个函数,用于根据预序遍历和无序遍历构建二叉树,最后再通过后序遍历的方式打印出结果。
```cpp
#include <iostream>
#include <string>
// 定义二叉树节点
struct TreeNode {
char val;
TreeNode* left;
TreeNode* right;
TreeNode(char x) : val(x), left(nullptr), right(nullptr) {}
};
// 根据无序遍历重建二叉树
TreeNode* buildTree(std::string inorder, std::string postorder) {
if (postorder.empty()) return nullptr;
// 预序遍历的第一个字符是根节点
TreeNode* root = new TreeNode(postorder[0]);
int preIndex = inorder.find(root->val);
// 递归构建左子树和右子树
root->left = buildTree(inorder.substr(0, preIndex), postorder.substr(1, preIndex - 1));
root->right = buildTree(inorder.substr(preIndex + 1), postorder.substr(preIndex + 1));
return root;
}
// 后序遍历打印
std::string printPostOrder(TreeNode* root) {
if (!root) return "";
std::string left = printPostOrder(root->left);
std::string right = printPostOrder(root->right);
return right + left + std::to_string(root->val);
}
int main() {
std::string preorder = "abdc";
std::string inorder = "dbca";
std::string postorder = printPostOrder(buildTree(inorder, preorder));
std::cout << "后序遍历: " << postorder << std::endl;
return 0;
}
```
在这个例子中,`buildTree` 函数根据无序遍历找到根节点,然后递归地构建左右子树。`printPostOrder` 函数则按照后序遍历的顺序打印节点值。
假定一棵二叉树一个结点用一个字符描述,现在给出中序和按层遍历的字符串,求该树 的先序遍历字符串。 样例输入 DBEAC ABCDE 样例输出 ABDEC 用c++实现
题目描述
给定二叉树的中序遍历序列和按层遍历序列,求该二叉树的先序遍历序列。
样例输入
DBEAC ABCDE
样例输出
ABDEC
算法思路
该题解法与上一题类似,我们可以通过中序遍历和按层遍历重构出二叉树,然后再进行先序遍历即可。
具体步骤如下:
- 构建一个无序哈希表,用于记录中序遍历中每个字符的位置,以便于后面快速确定左右子树。
- 以按层遍历的第一个字符作为根节点,创建一个队列,将根节点入队。
- 遍历按层遍历序列,对于每个字符,都创建一个新的节点,并根据中序遍历序列的位置,将其放置在相应的位置上。
- 如果当前遍历到的字符在队首节点的左子树中,就将其作为队首节点的左子节点,否则就将其作为队首节点的右子节点。如果一个节点有右子节点,那么它将会被弹出队列,直到找到它的父节点。
代码实现
以下是用C++实现的代码:
阅读全文