在字符串中找到全部是由指定的字符组成的最长子串

/*
 *!==============================================================
 *! FNAME: search.cpp
 *! BRIEF:
 *! AUTHR: RollStone
 *! EMAIL: [email protected]
 *! VERNO: 1.0.31
 *! CREAT: 2015-04-28 23:43:04
 *! CHGON: 2015-04-30 07:53:00
 *!
 *!     Copyright (c) 2015  All Rights Reserved By Abodu Org
 *!==============================================================
 */

///编写一个 C 函数,该函数在一个字符串中找到可能的最长的全部是由指定的字符组成的子字符串

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#ifndef strndup
//自己手动实现 复制字符串前 n 个字符
char* strndup(const char* src,int nMax) {
    int srcLen=strlen(src);
    int n=(srcLen<nMax)?srcLen:nMax;
    char* dest=(char*)calloc(n+1,sizeof(char));
    while(--n>=0)
        dest[n]=src[n];
    return dest;
}
#endif

/**
 * @brief
 *   在一个字符串中找到可能的最长的子字符串(该子字符串由同一字符组成)
 * @param str[]
 * @param tc    目标字符
 * @param rcLen 返回的目标子串的长度
 *
 * @return
 *     tc没有在str中出现,返回NULL,否则返回最长子串的起始位置
 */
char* search_max_substr(char src[],char ch,int* rcLen) {
    char* pStart;
    if(!src||!(pStart=strchr(src,ch))) {
        return NULL;
    }
    *rcLen=1;//至少有一个
    char* pEnd=strrchr(src,ch);
    if(pEnd==pStart) { //有且仅有唯一的一个字符ch
        return pStart;
    }
    char* rcOut=pStart;
    char* pCur=pStart+1;
    while(pCur-1<=pEnd) {
        if( *(pCur-1)==*pCur) {
            pCur++;
            continue;
        }
        //当前指针与其紧邻的前一个指针的内容不相同
        if(pCur-pStart>*rcLen) { //找到个数大于rcLen
            rcOut=pStart;
            *rcLen=pCur-pStart; //记录旧的移动次数
        }
        //找到剩下的字符串内的第一个ch
        if(!pCur||!(pStart=strchr(pCur,ch))) {
            break;
        }
        pCur=pStart+1;
    }
    return rcOut;
}

int main ( int argc, char* argv[] ) {
    char s[]="AAAABBBCCDDEFFFFFFFFFF";
    int n=0;
    char* p=search_max_substr(s,‘D‘,&n);
    if(p) {
        char* sbk=strndup(p,n);
        if(sbk) {
            printf("RESULT:%s\n",sbk);
            free(sbk);
        }
    }
    return 0;
} // end main
时间: 2024-10-14 04:39:19

在字符串中找到全部是由指定的字符组成的最长子串的相关文章

微软算法100题17 字符串中找到第一个只出现一次的字符

第17 题:题目:在一个字符串中找到第一个只出现一次的字符.如输入abaccdeff,则输出b 思路:要找出只出现一次的字符,很明显需要统计所有字符出现的次数,然后找出次数为一的那一个,统计次数最先想到的是hashTable,但此题有更好的办法,因为每个char其实对应一个唯一的ASCII值,所以可以构造一个包含所有字符ASCII值的int数组,来映射字符与出现次数的关系,同时一个char是8个字节,总共有256个可能,所以该数组的大小应为256 1 package com.rui.micros

17.在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4261992.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目:在一个字符串中找到第一个只出现一次的字符.如输入abaccdeff,则输出b . 题目分析: 求字符串的某个字符出现的次数可以很巧妙的运用split("字符&

在一个字符串中找到第一个只出现一次的字符。

题目:在一个字符串中找到第一个只出现一次的字符.如输入abaccdeff,则输出b. 分析:这道题是2006年google的一道笔试题. 下面给我的解法,采用linkedhashmap的有序,即可实现 private void getOne(String str){ LinkedHashMap<String, Object> linked=new LinkedHashMap<String, Object>(); for (char charstr : str.toCharArray

在一个字符串中找到第一个仅仅出现一次的字符

Google 2006年的一道笔试题,难度系数低 题目描写叙述: 在一个字符串中找到第一个仅仅出现一次的字符.如输入abaccdeff,则输出b. 逻辑分析: 1.简单粗暴O(n^2),一个显而易见的想法是像冒泡排序一样,採用两个循环,内层循环对外层判定元素arr[i]进行轮询,当发现arr[i] == arr[j]时,本次循环终止,显然,时间复杂度O(n^2),不使用额外空间. #include <stdio.h> #include <stdlib.h> #include <

在一个字符串中找到第一个只出现一次的字符

题目:在一个字符串中找到第一个只出现一次的字符. 例如: 输入abaccdeff,则输出b 思路剖析: 由于题目与字符出现的次数相关,可以统计每个字符在该字符串中出现的次数. 要达到这个目的,需要一个数据容器来存放每个字符出现的次数. 在这个数据容器中可以根据字符来查找它出现的次数.在常用的数据容器中,哈希表正是这个用途. 由于字符是一个长度为8的数据类型,因此总共有256种可能.于是我们创建一个长度为256的数组,每个字母根据其ASCII码值作为数组的下标对应数组的对应项.而数组中存储的是每个

从一个表达式字符串中找到最深层圆括号内的表达式

编程实现:从一个表达式字符串中找到最深层圆括号内的表达式. 如:从表达式 x+(y*z)+(m-(3+4)) 中找到3+4 .如果由多个表达式具有相同的最深深度则只需要给出其中一个.备注:算数表达式本身都是正确的,不要考虑括号不配对等错误表达式的处理. /* * 编程实现,从一个表达式字符串中找到最深层圆括号内的表达式. * 如: 从表达式 x+(y*z)+(m-(3+4))中找到3+4. 如果由多个表达式具有相同的最深深度则只需要给出其中一个. * 备注: 算数表达式本身都是正确的,不要考虑括

【编程题目】在一个字符串中找到第一个只出现一次的字符。如输入 abaccdeff,则输出 b。

第 17 题(字符串):题目:在一个字符串中找到第一个只出现一次的字符.如输入 abaccdeff,则输出 b. 思路:此题非常容易. 最开始是想开辟一块空间存储每个字符出现的次数. 但转念一想,似乎没有必要. 对每一个字符,都依次和后面的比较,若出现了两次,则检查下一个字符,遇到只出现一次的,直接输出就好了. /* 第 17 题(字符串): 题目:在一个字符串中找到第一个只出现一次的字符.如输入 abaccdeff,则输出 b. 分析:这道题是 2006 年 google 的一道笔试题. */

字符串:查找字符串中首个出现一次的字符

题目: 在一个字符串中找到第一个只出现一次的字符.如输入 abaccdeff,则输出 b. 思路: 我们可以依次遍历求出每个字符的次数,即每求一个字符的次数,就遍历一次字符串.但是这样时间复杂度为O(n*n). 这样考虑,每个字符对应一个ASCII值,我们可以设定一个数组长度为256,每一个字符的ASCII码值即数组的index值.遇到相同的就加一. 最后遍历一次求第一个出现一次的字符. 代码: #include<iostream> #include<string> using n

C语言:从p所指字符串中找出ASCII码最大的字符,将其放在第一个位置上,并将该字符前的原字符向后顺序移动。

//fun函数:从p所指字符串中找出ASCII码最大的字符,将其放在第一个位置上,并将该字符前的原字符向后顺序移动. 1 #include <stdio.h> 2 void fun( char *p ) 3 { char max,*q; int i=0; 4 max=p[i]; 5 while( p[i]!=0 ) 6 { if( max<p[i] ) 7 { max=p[i]; 8 /**********found**********/ 9 q = p + i;//先找到最大值,记录最