前言

啥是子串?
串中任意个连续字符组成的子序列称为该串的子串。
包含子串的串相应地称为主串。
①空串是任意串的子串。
②任意串是其自身的子串。
例:字符串"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大功告成。

下面开始一些美化:

总结

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

用C语言输出一个字符串的所有子串相关推荐

  1. 用substr()函数高效的输出一个字符串的所用子串

    需要的头文件 #include<string> 需要的其他东西 using namespace std; substr(pos,len) 返回从pos号位开始,长度为len的子串,时间复杂 ...

  2. C语言 输入一个字符串,统计字符个数,并按照倒序输出该字符串。

    题目:C语言 输入一个字符串,统计字符个数,并按照倒序输出该字符串. #include<stdio.h>void main() {char str[10];scanf("%s&q ...

  3. C语言统计一个字符串(包含空格)中字母的种类(不是个数)

    C语言统计一个字符串(包含空格)中字母的种类(不是个数) 写了一个小程序来通过输入一个字符串后,统计26个字母中出现了几种. 例如:输入juue 输入3输入abcd efg lmn输出10 思路简述 ...

  4. c语言:输入一个字符串,统计字母,数字,空格出现的个数,c - 统计字符串字母,空格,数字,其他字符的个数和行数....

    #include #include using namespace std; /* 题目:输入一行字符,分别统计出其中英文字母.空格.数字和其它字符的个数. */ void count() { //统 ...

  5. C语言检查一个字符串是否为另一个字符串的子字符串的算法(附完整源码)

    C语言检查一个字符串是否为另一个字符串的子字符串的算法 C语言检查一个字符串是否为另一个字符串的子字符串的算法完整源码(定义,实现,main函数测试) C语言检查一个字符串是否为另一个字符串的子字符串 ...

  6. c语言输出字母随机数,你好,怎样用c语言输出一个1到100的随机数

    你好,怎样用c语言输出一个1到100的随机数以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 你好,怎样用c语言输出一个1 ...

  7. C语言输出一个菱形图案

    用c语言输出一个由星号*组成的菱形图案 #include<stdio.h> int main() {//首先写菱形的上半部分int line = 0;printf("请输入行数& ...

  8. 算法设计 - 寻找一个字符串的重复子串LRS

    虽是读书笔记,但是如转载请注明出处 http://segmentfault.com/blog/exploring/ .. 拒绝伸手复制党 问题描述: 首先这是一个单字符串问题.子字符串 R 在字符串 ...

  9. 寻找一个字符串的重复子串 后缀数组

    什么是后缀数组 令字符串 S=S[1]S[2]...S[n]S=S[1]S[2]...S[n]{\displaystyle S=S[1]S[2]...S[n]} , S[i,j]S[i,j]{\dis ...

最新文章

  1. LeetCode简单题之数组中第 K 个独一无二的字符串
  2. python重命名文件pycharm_Python中批量修改变量名太费劲?Pycharm中使用重命名一次搞定...
  3. 批量 杀掉 mysql 连接_批量杀死MySQL连接的四种方法详解
  4. 【复习】服务器主板——Leez P710
  5. 初学__Python——Python数据类型之字典
  6. COJ1005(Binary Search Tree analog)
  7. miRNA实验与荧光素酶
  8. 数据结构与算法--举例分析法- 栈的压入弹出序列
  9. ACM-ICPC 2018 沈阳赛区现场赛 K. Let the Flames Begin (约瑟夫环问题)
  10. pytorch查缺补漏之CUDA,自动求导
  11. 案例学习BlazeDS+Spring之六InSync04打开多个联系人
  12. AD17入门简单教程(一)
  13. 【Themes for IntelliJ-based IDEs】Idea主题下载
  14. 【fiddler抓包修改订单金额】
  15. fiddler+mitmproxy+夜神模拟器安装
  16. 修改element插件样式---select样式
  17. Linux chrome/firefox flash过期问题解决办法
  18. 大健康产业B2B2C多用户电商平台开发,开启数字化消费新蓝海
  19. 手机上如何学会使用计算机,手机怎么投屏到电脑上,我这儿有4种方法,一分钟让你学会...
  20. 什么是A.B.C类网络 怎么区别和划分

热门文章

  1. anaconda3下opencv安装
  2. 4.14 | 学习笔记
  3. java8模拟grouby方法
  4. [hdu3549]Flow Problem(最大流模板题)
  5. swift学习笔记-UI篇之UIImageView
  6. 第二阶段团队项目冲刺第七天
  7. The difference between sleep(), wait(), and yield() in human terms.
  8. V3S拍照上传又拍云bug排查过程
  9. Tensorflow基于minist数据集实现自编码器
  10. C++ Primer 5th笔记(chap 17 标准库特殊设施)随机数