zl程序教程

您现在的位置是:首页 >  后端

当前栏目

用C语言输出一个字符串的所有子串

C语言输出 一个 字符串 所有 子串
2023-09-11 14:15:52 时间

前言

啥是子串?
串中任意个连续字符组成的子序列称为该串的子串。
包含子串的串相应地称为主串。
①空串是任意串的子串。
②任意串是其自身的子串。
例:字符串"12"它的字串为"1",“2”,“12”,空串。共四个字串。

原理

懂了子串的概念我们来分析一下原理:
当字符串是"1"的时候
子串为:
“1”
空串
字串个数为2=1+1

当字符串是"12"的时候
子串为:
“1” “12”
“2”
空串
字串个数为4 =2+1+1

当字符串是"123"的时候
子串为:
“1” “12” “123”
“2” “23”
“3”
空串
字串个数为7=3+2+1+1

当字符串是"1234"的时候
子串为:
“1” “12” “123” “1234”
“2” “23” “234”
“3” “34”
“4”
空串
字串个数为11=4+3+2+1+1

通过上面的规律可以看出是一个等差数列再加1
设字符串的长度为n;子串个数为s
则s=n(n+1)/2+1;

看一下下面这张图:
在这里插入图片描述
这所有子串不就是一个倒三角么?不过是一个稍微特殊的倒三角
是不是特别的神奇。

这是我之前写的c语言输出等腰三角形文章。

分析

以这张图为例:
在这里插入图片描述
我们要输出倒三角的话,是需要二层嵌套的for循环的。
这个和平常的不一样。应该需要三层的for()循环。究竟是不是?我们分析一下便知道了。


正所谓,遇到个难的问题要先化简为一个个小问题。
我们先分析一下如何输出第一行。
”1“,”12“,”123“,”1234“,
你会发现都是从第一个字符"1"开始,然后依次遍历。这一定需要一个循环。先设为j吧。
再来分析它们的长度是依次增加的。这一定也需要一个循环。先设为i吧。
故由上可知: i代表这一个的字符串的长度,j代表初始遍历的下标
分析一下i和j的关系,
当 i=1 j遍历1次
当 i=2 j遍历2次
当 i=3 j遍历3次
可以看出:随之i的增加,j遍历的次数也在增加。
于是,代码如下:
在这里插入图片描述

因为在C语言里的初始下标是从0开始的。
但是i的含义是代表字符串的长度。
上面那种代码不方便理解,于是有了下面这个代码。

在这里插入图片描述
下面再来分析一下,如何输出多行。
你会发现,第一行最长为"1234",第二行最长为"123"。
说明随着行数的增加,每行的字符串的最大长度在减少。
这说明需要第三层的for()循环。
而最外层的for()循环是控制这一行的最大长度的。
设最外层的for()循环的循环变量为k。
分析一下k和i的关系。
k是用来控制这一行的字符串的最大长度。即 i 的最大值


再分析一下
第一行的字符串的下标都是从第一个开始的。
第二行的字符串的下标都是从第二个开始的。
所以每输出一行,开始遍历的下标就得增1,即 j 随着行数的增加 j的初始值逐渐变大。
故总的代码如下:
在这里插入图片描述

ok大功告成。

下面开始一些美化:
在这里插入图片描述

总结

遇到问题一步步的分析。本题直接上手三层循环不容易想出来。
先二层循环,再添加三层循环,一步步分析,调试,弄懂原理。