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: 2
The 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次的所有位置,返回值为指针数组,的主要内容,如果未能解决你的问题,请参考以下文章

找出字符串中只出现一次的字符(C++)

c++编程中怎样用strncmp函数计算两个字符串的数目,并比较大小。

用java编写一个字符串的程序,找出连续出现三次的字符

面试题50:第一个只出现一次的字符(C++)

C++信奥赛题目——第一个只出现一次的值

第一个只出现一次的字符