递归问题之一:给定一字符串,输出字符串中所有字符子串的各种组合形式,长度为一个字符到字符串的长度,忽略排序

本文介绍了使用递归实现字符串子串提取的算法,并通过输入示例演示了具体实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
using namespace std;
enum{MAX=100};
void SubString(char src[],char out[],int oi){
 for(int i=0;i<strlen(src);++i){
  out[oi]=src[i];
  int j=0;
  out[oi+1]='\0';
  cout<<out<<endl;
  if(i<strlen(src)-1)
   SubString(src+1+i,out,oi+1);
 }
}
int main(){
 char src[MAX];
 char out[MAX];
 cout<<"Input the source string:"<<endl;
 cin>>src;
 SubString(src,out,0);
 return 0;
}

 

在Python中,计算一个字符串中有多少个回文子字符串可以采用动态规划的方式。我们可以定义一个二维数组dp,其中dp[i][j]表示从索引i到j的子串是否为回文。然后我们遍历字符串s,对于每个字符,我们将它作为中心点向两边扩展,判断以该字符为中心形成的奇数长度回文以及偶数长度回文的数量。 算法步骤如下: 1. 初始化:dp[i][i] = True (单个字符都是回文) 和 dp[i][i+1] = (s[i] == s[i+1]) (两个连续字符组成的子串) 2. 遍历s的长度: a. 对于每个子串长度k(2 <= k <= n),检查所有可能的起始位置i: i. 如果s[i] == s[j](j = i + k - 1),则dp[i][j] = dp[i+1][j-1] (如果首尾字符相同,则递归地检查去掉首尾字符子串) ii. 计算以当前字符为左右边界的所有奇数长度回文数量(dp[i][j-1])和偶数长度回文数量(dp[i+1][j])并累加。 3. 最终结果就是dp矩阵对角线元素之和,因为对角线上的值只统计了单个字符的回文子串。 以下是Python代码实现: ```python def countSubstrings(s): n = len(s) dp = [[0] * n for _ in range(n)] # 单个字符和两个相同字符构成的回文 for i in range(n): dp[i][i] = 1 if i < n - 1 and s[i] == s[i + 1]: dp[i][i + 1] = 1 # 动态规划,寻找所有长度的回文子串 for length in range(2, n + 1): for start in range(n - length + 1): end = start + length - 1 if s[start] == s[end]: # 如果首尾字符相同 dp[start][end] = dp[start + 1][end - 1] # 递归 dp[start][end] += dp[start + 1][end] # 奇数长度回文 dp[start][end] += dp[start][end - 1] # 偶数长度回文 return sum(dp[0]) # 测试示例 s = "abcba" print(countSubstrings(s)) # 输出:6 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值