字符串子集求解C/C++
前几天在面试的时候遇到一个手撕代码片段问题,题目为:求解字符串所有的子集,虽然实现出来了,但是看起来很复杂凌乱,面试后思路整理重新对代码优化(菜鸟理解,请各路大佬赐教)。
求解一个串的子集,我首先想到的是使用回溯法,但是传统的回溯写起来过于复杂,所以我想到了一种很简化的回溯方法。如下图:
实现思维就是遍历字符串(str)的每个元素作为子串的起始位置(low),然后从1开始增加字串的步长(step,即字串长度),直至原字符串的结尾,在判断是否到达结尾处可采 :子串的起始位加步长小于等于原串的长度 ,即 low + step <= str.length()。
实现代码如下:
#include<iostream>
#include<string>
using namespace std;
void main()
{
string str;
cout << "请输入字符串:";
cin>>str;
cout << "子集为:" << endl;
for (int low = 0; low < str.length(); low++)//low位子串的起始位置,遍历整个原字符串的每个元素作为子串起始位
for(int step = 1; low + step <= str.length(); step++)//step为步长,当前起始位下从步长唯1开始加以增长到最大步长,遍历以low为首的所有子串
cout << str.substr(low, step) << endl;//输出子串
}
运行结果:
菜鸟的见解希望对大家有所帮助,当然求各路大佬赐教。