统计回文-牛客网(简单计算)

本文探讨了一种算法问题,即如何通过将字符串B插入到字符串A中来构造回文串,并计算出所有可能的插入位置使得新串成为回文串的方法数。通过示例演示了具体的实现过程。

题目描述
“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。花花非常喜欢这种拥有对称美的回文串,生日的时候她得到两个礼物分别是字符串A和字符串B。现在她非常好奇有没有办法将字符串B插入字符串A使产生的字符串是一个回文串。你接受花花的请求,帮助她寻找有多少种插入办法可以使新串是一个回文串。如果字符串B插入的位置不同就考虑为不一样的办法。
例如:
A = “aba”,B = “b”。这里有4种把B插入A的办法:
* 在A的第一个字母之前: “baba” 不是回文
* 在第一个字母‘a’之后: “abba” 是回文
* 在字母‘b’之后: “abba” 是回文
* 在第二个字母’a’之后 “abab” 不是回文
所以满足条件的答案为2
输入描述:
每组输入数据共两行。
第一行为字符串A
第二行为字符串B
字符串长度均小于100且只包含小写字母
输出描述:
输出一个数字,表示把字符串B插入字符串A之后构成一个回文串的方法数
示例1
输入

aba
b
输出

2

# 统计回文

strA = str(input())
strB = str(input())

sum = 0
for i in range(len(strA)+1):
    strC0 = strA[0:i]+strB+strA[i:len(strA)]
    strC1 = strC0[::-1] # 字符串反转,步长为-1,从右向左
    if strC0 == strC1:
        sum += 1;

print(sum)
以下是解决牛客网该 C 语言问题的详细方案。 ### 问题分析 要计算正整数 `x` 截取连续区间得到重排后可形成回文数的方案数,需要完成以下几个步骤: 1. 将正整数 `x` 转换为字符串,方便进行区间截取操作。 2. 遍历所有可能的连续区间。 3. 对于每个截取的区间,判断其重排后是否可以形成回文数。 4. 统计满足条件的区间数量。 ### 代码实现 ```c #include <stdio.h> #include <string.h> // 判断一个字符串重排后是否可以形成回文数 int canFormPalindrome(char *str, int start, int end) { int count[10] = {0}; // 统计个数字的出现次数 for (int i = start; i <= end; i++) { count[str[i] - '0']++; } int oddCount = 0; // 统计出现奇数次的数字的个数 for (int i = 0; i < 10; i++) { if (count[i] % 2 == 1) { oddCount++; } } // 如果出现奇数次的数字个数不超过 1,则可以重排形成回文数 return oddCount <= 1; } // 计算正整数 x 截取连续区间得到重排后可形成回文数的方案数 int countPalindromeSubstrings(int x) { char str[20]; // 将整数 x 转换为字符串 sprintf(str, "%d", x); int len = strlen(str); int count = 0; // 遍历所有可能的连续区间 for (int i = 0; i < len; i++) { for (int j = i; j < len; j++) { if (canFormPalindrome(str, i, j)) { count++; } } } return count; } int main() { int x; // 输入正整数 x scanf("%d", &x); // 计算方案数 int result = countPalindromeSubstrings(x); // 输出结果 printf("%d\n", result); return 0; } ``` ### 代码解释 1. **`canFormPalindrome` 函数**:该函数用于判断一个字符串重排后是否可以形成回文数。通过统计个数字的出现次数,然后统计出现奇数次的数字的个数。如果出现奇数次的数字个数不超过 1,则可以重排形成回文数。 2. **`countPalindromeSubstrings` 函数**:该函数用于计算正整数 `x` 截取连续区间得到重排后可形成回文数的方案数。首先将整数 `x` 转换为字符串,然后遍历所有可能的连续区间,对于每个区间调用 `canFormPalindrome` 函数进行判断,如果满足条件则方案数加 1。 3. **`main` 函数**:该函数用于读取输入的正整数 `x`,调用 `countPalindromeSubstrings` 函数计算方案数,并输出结果。 ### 复杂度分析 - **时间复杂度**:$O(n^2 * 10)$,其中 $n$ 是正整数 `x` 的位数。需要遍历所有可能的连续区间,每个区间需要 $O(10)$ 的时间来判断是否可以重排形成回文数。 - **空间复杂度**:$O(10)$,主要用于存储每个数字的出现次数。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值