输入一个数字串,求他们有多少个连续子串不会同时出现1和4这两个数字C语言
时间: 2024-05-02 21:20:39 浏览: 14
的实现如下:
```
#include <stdio.h>
#include <string.h>
int main() {
char s[100];
int n, count = 0;
scanf("%s", s);
n = strlen(s);
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
int has1 = 0, has4 = 0;
for (int k = i; k <= j; k++) {
if (s[k] == '1') has1 = 1;
if (s[k] == '4') has4 = 1;
}
if (!has1 || !has4) count++;
}
}
printf("%d\n", count);
return 0;
}
```
思路是枚举所有可能的子串,然后判断这个子串中是否同时出现了数字1和4,如果没有,则累加计数。
相关问题
给定一个字符串s,s中只包含数字,请返回s中最长的特殊的回文子串的长度 特殊的回文子串t满足 ·t进行任何次交换后可以变成一个回文字符申 输入格式 输入第一行包含一个字符串s。 数据范围 1s≤10^5 输出格式 特殊的回文子串的最长长度用C语言怎么写
### 回答1:
C++代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
bool check(string s)
{
int n = s.size();
for (int i = 0, j = n - 1; i < j; i ++, j --)
if (s[i] != s[j])
return false;
return true;
}
int main()
{
string s;
cin >> s;
int n = s.size();
int ans = 0;
for (int i = 0; i < n; i ++)
for (int j = i; j < n; j ++)
{
string t = s.substr(i, j - i + 1);
if (!check(t)) continue;
for (int k = i; k <= j; k ++)
for (int l = k + 1; l <= j; l ++)
{
swap(t[k - i], t[l - i]);
if (check(t)) ans = max(ans, j - i + 1);
swap(t[k - i], t[l - i]);
}
}
cout << ans << endl;
return 0;
}
### 回答2:
首先,我们可以使用双指针法来解决这个问题。
算法步骤如下:
1. 定义两个指针left和right,分别指向字符串s的开头和结尾。
2. 当left < right时,循环执行以下步骤:
a. 如果s[left]和s[right]相等,则将left向右移动一位,将right向左移动一位。
b. 如果s[left]和s[right]不相等,则返回字符串s的长度(即s的长度就是一个特殊的回文子串的最长长度)。
3. 如果循环结束时left >= right,则返回1(表示字符串s是一个特殊的回文子串)。
C语言代码示例:
```c
#include <stdio.h>
#include <string.h>
int longestSpecialPalindromeLength(char* s) {
int len = strlen(s);
int left = 0, right = len - 1;
while (left < right) {
if (s[left] == s[right]) {
left++;
right--;
} else {
return len;
}
}
return 1;
}
int main() {
char s[100000];
scanf("%s", s);
int length = longestSpecialPalindromeLength(s);
printf("%d\n", length);
return 0;
}
```
注意:代码中假设不会输入空字符串。并且为了方便起见,将字符串s的最大长度限定为100000,可以根据实际需求进行调整。
### 回答3:
在C语言中,可以使用以下代码来解决该问题:
```c
#include<stdio.h>
#include<string.h>
int isPalindrome(char *str, int start, int end) {
while (start < end) {
if (str[start] != str[end]) {
return 0;
}
start++;
end--;
}
return 1;
}
int specialPalindromeLength(char *s) {
int length = strlen(s);
int max_length = 0;
for (int i = 0; i < length; i++) {
for (int j = length - 1; j >= i; j--) {
if ((j - i + 1) <= max_length) {
break;
}
if (isPalindrome(s, i, j)) {
int unique = 1;
for (int k = i; k <= j; k++) {
if (s[k] != s[i]) {
unique = 0;
break;
}
}
if (unique == 1) {
max_length = j - i + 1;
break;
}
}
}
}
return max_length;
}
int main() {
char s[100000];
scanf("%s", s);
int result = specialPalindromeLength(s);
printf("%d\n", result);
return 0;
}
```
该代码首先定义了一个函数`isPalindrome`,用于判断一个字符串是否是回文串。该函数接受一个字符串指针和起始位置和结束位置的索引,并通过比较字符来判断是否是回文串。
接下来,定义了一个函数`specialPalindromeLength`,它接收一个字符串,并返回字符串中最长的特殊回文子串的长度。在这个函数中,使用两个嵌套循环来遍历所有可能的子串,并通过调用`isPalindrome`函数来判断是否是回文字符串。如果是回文串,还需判断是否是特殊回文子串(即子串中只有一种字符),如果是特殊回文子串,更新最长长度。
在主函数`main`中,首先读取输入的字符串,并调用`specialPalindromeLength`函数来计算最长特殊回文子串的长度,并打印结果。
注意,该代码中的字符串长度假设不超过100000,可以根据实际情况进行调整。
查找字符串中最长的数字子串。
查找字符串中最长的数字子串可以通过编程实现。可以使用两种方法:一种是Python实现,另一种是C语言实现。Python实现可以使用字典来存储所有的数字子串,然后找到最长的数字子串并输出。C语言实现可以使用双重循环来查找数字子串,找到最长的数字子串并输出。具体实现方法可以参考以下引用内容。
引用:
解题思路:子串是原字符串中的一段连续的字符,首先,共有字符串的长度一定是小于等于最短字符串的,然后判断最短字符串中各个子串是否在长字符串内,相同长度的共有子串可能有多个,最长的共有子串也可能有多个,共有子串是唯一的,子串长度是可能相同的,可以创建一个字典,键为子串,值为子串长度,然后需要一个由值求键的函数,输入特定长度求取对应的子串,一个长度值可能对应多个键。
示例代码:
x=input("第一个字符串是:")
y=input('第二个字符串是:')
if len(x)>len(y):
x,y=y,x
L=len(x)
s=dict()
flag=False
for i in range(L,0,-1):
for j in range(L-1):
if i-1>j:
flag=x[j:i] in y
if flag==True:
s[x[j:i]]=len(x[j:i])
#获得特定字符长度的共有子串函数,包括所有特定字符长度的共有子串
def get_key(val):
target=list()
for key,value in s.items():
if val == value:
target.append(key)
return target
print('两个字符串共有的最长子串是:',get_key(max(s.values())))
引用:
编程要求:实现查找字符串中最长数字子串的长度,并将其输出(可以改进:用while实现运行效率高)
示例代码:
#include<stdio.h>
#include<string.h>
#define MAX_SIZE 1000
void search_numstr(char* str) {
int i;
int j;
int x;
int y;
int count=0,len=0;
char str2[MAX_SIZE]={0};
for(i=0;(str+i) != '\0';i++) {
for(j=0;(str+i+j)>='0'&&*(str+i+j)<='9';j++) {
count++;//当前数字子串的长度
}
if(len<count)//如果找到了更长的数字子串
{
len =count;
for(x=0;x<len;x++)//每次都进行覆盖,留下最后最长的数字子串
{
*(str2+x) = *(str+x+i);
}
*(str2+len) = '\0';
}
count = 0;
}
printf("%d\n",len);
for(x=0;x<len;x++) {
printf("%c",*(str2+x));
}
printf("\n");
}
相关问题:
1. 如何查找字符串中的所有数字子串?
2. 如何查找字符串中的最长字母子串?
3. 如何将字符串中的数字子串转换为整数?
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pptx](https://img-home.csdnimg.cn/images/20210720083543.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![pptx](https://img-home.csdnimg.cn/images/20210720083543.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)