C++ 怎么编写一个字符串中某个字符出现n次的所有位置,返回值为指针数组,
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 怎么编写一个字符串中某个字符出现n次的所有位置,返回值为指针数组,相关的知识,希望对你有一定的参考价值。
strchr函数只是返回第一字出现的位置,那么如果出现了n次,那么它的位置呢。最好模仿strchr函数,
假定字符串已输入,存放在 char s[200] 中。要找的某字符 已输入,存放在 char ch 中。
用循环语句:for (i=0;i<strlen(s);i++) if (s[i]==ch)。。。; 就可找到 所有出现位置。
你可以开一个大数组,来存放位置,简单方便。
下面用噜苏的方法,按需要逐渐增加内存大小,动态地 分配单元 (char *p) ,把找到的下标位置存进去。
处理完毕再依次把下标位置 打印出来。
#include<stdio.h>
#include<stdlib.h>
main()
char s[200]="abcd123 abcd123 abcd123";
char ch='c';
int *p=NULL;
int *more_p = NULL;
int n = 0;
int i;
for (i=0;i<strlen(s);i++)
if (s[i]==ch)
n++;
more_p = (int *) realloc(p, n * sizeof(int));
if (more_p!=NULL) p=more_p; p[n-1]=i;
else
free (p);
printf("Error (re)allocating memory");
exit (1);
;
;
; // for
printf("location: ");
for (i=0;i<n;i++) printf("%d ",p[i]);
free(p);
return 0;
参考技术A #include "stdio.h"
#include <time.h>//
#define N 300
void main(void)
char a[N]="",*pa[N],ch;
int i,j;
srand((unsigned)time(NULL));
for(i=0;i<N;a[i++]=rand()%94+32);
printf("What is to find the character?\nch=");
ch=getchar();
for(j=i=0;i<N;i++)
if(ch==a[i]) pa[j++]=i+a;
printf("'%c' in the following address:\n",ch);
for(i=0;i<j;printf("%p ",pa[i++]));
printf("\n");
参考技术B
strchr实现为
char* strchr(char* s,char c)while(*s != '\\0' && *s != c)
++s;
return *s == c ?s:NULL;
例子
#include <string.h>#include <stdio.h>
int main(void)
char string[17];
char *ptr, c = 'i';
strcpy(string, "This is a string");
ptr = strchr(string, c);
if (ptr)
printf("The character %c is at position: %d\\n", c, ptr-string);
else
printf("The character was not found\\n");
return 0;
结果
The character i is at position: 2模仿strchr的函数strNchr
#include <stdio.h>char **strNchr(char* s,char c, char **n)
char **p=n;
while(*s != '\\0')
if(*s == c)
*n++=s;
++s;
*n=NULL;
return p != n ?p:NULL;
void print(char *s,char c,char **n)
while(*n++!=NULL)
printf("The character %c is at position: %d\\n", c, *(n-1)-s);
int main(void)
char string[17]="This is a string";
char *n[17],**ptr,char c = 'i';
ptr = strNchr(string, c,n);
if (ptr)
print(string, c,ptr);
else
printf("The character was not found\\n");
return 0;
结果
The character i is at position: 2The character i is at position: 5
The character i is at position: 13追问
谢谢热心的朋友,中秋快乐。
参考技术C 遍历遍历还是遍历出现n次的最长子串
【中文标题】出现n次的最长子串【英文标题】:Longest substring that appears n times 【发布时间】:2010-04-04 19:31:53 【问题描述】:对于长度为L的字符串,我想找到在该字符串中出现n(n
例如,“BANANA”中出现2次或多次的最长子串是“ANA”,一次从索引1开始,再次从索引3开始。允许子串重叠。
字符串“FFFFFF”中出现3次以上的最长字符串为“FFFF”。
n=2 的蛮力算法将选择字符串中的所有索引对,然后一直运行直到字符不同。运行部分需要 O(L) 并且对数是 O(L^2) (不允许重复,但我忽略了这一点)所以对于 n=2,该算法的复杂度为 O(L^3)。对于较大的 n 值,它会呈指数增长。
有没有更有效的算法来解决这个问题?
【问题讨论】:
【参考方案1】:后缀树可以非常快速地解决这类问题,通常是 O(n) 时间和空间。
查看维基页面:
Suffix Trees.
并阅读该页面上链接到的材料(功能部分):
Longest Repeated Substring.
【讨论】:
优秀的答案(与您的用户名相反)!【参考方案2】:Longest common substring problem
【讨论】:
以上是关于C++ 怎么编写一个字符串中某个字符出现n次的所有位置,返回值为指针数组,的主要内容,如果未能解决你的问题,请参考以下文章