字符串算法总结

  • 数字转字符串
  • 字符串逆置(char*、string、折半法逆置字符串)
  • 字符串逆置保持单词不变
  • 实现strcpy,strcat,strcmp,strstr
#include<iostream>
#include<string>
#include<assert.h>
using namespace std;

//数字转字符串
string InttoChar(int num){
    if(num==0)
        return "0";
    string res;
    while(num!=0){
        int tmp=num%10;
        char ctmp=tmp+‘0‘;
        res.push_back(ctmp);
        num/=10;
    }
    reverse(res.begin(),res.end());
    return res;
}
//字符串逆置
string reversestring(string s1){
    if(s1=="")
        return s1;
    string s2="";
    for(int i=s1.length()-1;i>=0;i--){
        s2+=s1[i];
    }
    return s2;
}
//折半法逆置字符串
char* revetsestring(char* s1){
    if(s1==NULL)
        return s1;
    int len=strlen(s1);
    char* p1,*p2;
    p1=s1,p2=s1+len-1;
    char tmp;
    while(p1!=p2){
        tmp=*p1;
        *p1=*p2;
        *p2=tmp;

        p1++;
        p2--;
    }
    return s1;
}
//字符串逆置单词内部顺序不变
char* ReverseWords(char* s1){
    int len=strlen(s1);
    if(s1==NULL||len==1)
        return s1;
    int i=len-1,j=len;  //ij记录单词的位置
    int t=0; //暂存已经录入单词的位置
    char* res= new char[len+1]; //len不包含‘\0‘要申请len+1个
    int k=0;  //新字符串的位置
    while(i>0){
        while(s1[i]!=‘ ‘&&i!=0)
            i--;
        t=i;
        if(i!=0)
        {
            i++;
            while(i<j){
                res[k++]=s1[i++];
            }
            res[k++]=‘ ‘;
            j=t;
            i=t-1;
        }
        else{
            while (i<j)
            {
                res[k++]=s1[i++];
            }
            i=t;
        }

    }
    res[len]=‘\0‘;
    return res;
}

//分别实现strcpy,strcat,strcmp,strstr
//strcpy需要一个指针记录开始的位置
char* stringcpy(char* des,char* src){
    if(src==NULL)
        return src;
    int len=strlen(src);
    des=new char[len+1];
    char* res=des;
    while(*src!=‘\0‘)
        *des++=*src++;
    *des=‘\0‘;
    return res;
}

//strcat,strcat需要des保证可以容纳src,我们这里不需要
char* stringcat(char* des,char*src){
    if(src==NULL)
        return des;
    int len1=strlen(des);
    int len2=strlen(src);
    char* newstr=new char[len1+len2+1];
    char* res=newstr;
    while (*des!=‘\0‘)
        *newstr++=*des++;
    while(*src!=‘\0‘)
        *newstr++=*src++;
    *newstr=‘\0‘;
    return res;
}

//strcmp,使用assert要包含其头文件assert.h不满足assert条件会报错
int stringcmp(char* s1,char* s2){

    assert((s1!=NULL)&&(s2!=NULL));
    while(*s1&&*s2&&(*s1==*s2)){
        s1++;
        s2++;
    }
    return *s1-*s2;
}

//strstr leetcode有原题,做过
bool samestr(char* s1,char* s2){
    if(strlen(s1)!=strlen(s2))
        return false;
    while(*s1){
        if(*s1==*s2){
            s1++;
            s2++;
        }
        else return false;
    }
    return true;
}
char* stringstr(char* s1,char* s2){
    if(s1==NULL||s1==NULL)
        return NULL;
    int len1=strlen(s1);
    int len2=strlen(s2);
    if(len2>len1)
        return NULL;
    if(len1==len2){
        if(samestr(s1,s2))
            return s1;
        else return NULL;
    }

    for(int i=0;i<len1;){
        char* tmp=NULL;
        for(int j=0;j<len2;j++)
            tmp+=s1[i+j];
        tmp+=‘\0‘;
        if(samestr(tmp,s2))
            return s1+i;
        else i++;
    }
    return NULL;
}

int main(){
    int num=1234569;
    string res=InttoChar(num);
    cout<<res<<endl;

    char* test="guofei is a student in SEU!";
    string test1="helloworld";
    char* test2="happyforever";
    cout<<reversestring(test2)<<endl;
    cout<<reversestring(test1)<<endl;
    cout<<ReverseWords(test)<<endl;

    char* s1,*s2="cpy this string";
    cout<<stringcpy(s2,s2)<<endl;
    cout<<stringcmp(test,test2)<<endl;

    char* s3="auti";
    char* s4="beautiful girl";
    if(stringstr(s3,s4))
        cout<<"fei zi chuan"<<endl;
    else cout<<"zichuan"<<endl;  //this problem is really tricky, i try to cout NULL and i fix bug just for this little error makes me very wordless
    return 0;
}
时间: 2024-10-11 18:20:28

字符串算法总结的相关文章

字符串算法之 AC自己主动机

近期一直在学习字符串之类的算法,感觉BF算法,尽管非常easy理解,可是easy超时,全部就想学习其它的一些字符串算法来提高一下,近期学习了一下AC自己主动机.尽管感觉有所收获,可是还是有些朦胧的感觉,在此总结一下,希望大家不吝赐教. 一.AC自己主动机的原理: Aho-Corasick automaton.该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之中的一个. 一个常见的样例就是给出N个单词,在给出一段包括m个字符的文章,让你找出有多少个单词在这文章中出现过,.要搞懂AC自己主动

字符串算法

字符串算法 字符串字符判重算法 字符串反转算法 字符串左旋算法 字符串右旋算法 字符串旋转匹配算法 字符串包含算法 字符串删除算法 字符串原地替换算法 字符串压缩算法 字符串变位词检测算法 字符串转整数算法 字符串全排列算法 字符串字典序组合算法 字符串的(括号)生成算法 字符串字符判重算法 给定字符串,确定是否字符串中的所有字符全都是不同的.假设字符集是 ASCII. 1 using System; 2 using System.Collections.Generic; 3 4 namespa

boost字符串算法

boost::algorithm简介 2007-12-08 16:59 boost::algorithm提供了很多字符串算法,包括: 大小写转换: 去除无效字符: 谓词: 查找: 删除/替换: 切割: 连接: 我们用写例子的方式来了解boost::algorithm能够为我们做些什么. boost::algorithm学习#include <boost/algorithm/string.hpp>using namespace std;using namespace boost; 一:大小写转换

KMP查找子字符串算法

举例说明: S:  ababcababa P:  ababa KMP算法之所以叫做KMP算法是因为这个算法是由三个人共同提出来的,就取三个人名字的首字母作为该算法的名字.其实KMP算法与BF算法的区别就在于KMP算法巧妙的消除了指针i的回溯问题,只需确定下次匹配j的位置即可,使得问题的复杂度由O(mn)下降到O(m+n).  在KMP算法中,为了确定在匹配不成功时,下次匹配时j的位置,引入了next[]数组,next[j]的值表示P[0...j-1]中最长后缀的长度等于相同字符序列的前缀.  对

常用字符串算法

简介 字符串的处理几乎无处不在,常用的字符串算法有KMP.扩展KMP.Trie树.AC自动机.Manacher.哈希.SA.SAM等. Knuth-Morris-Pratt 算法 给你两个字符串AB,询问B串是否是A串的子串(A串是否包含B串). 可以枚举从A串的什么位置起开始与B匹配,然后验证是否匹配.假如A串长度为n,B串长度为m,那么这种方法的复杂度是O (mn)的. 而KMP算法能够在线性复杂度内求出一个串在另一个串的所有匹配位置. KMP的核心思想在于构建一个前缀数组(失配数组),对于

随机生成32位字符串算法

随机生成32位字符串算法: function getRandom() { var arr = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D"

浅谈字符串算法(KMP算法和Manacher算法)

[字符串算法1] 字符串Hash(优雅的暴力) [字符串算法2]Manacher算法 [字符串算法3]KMP算法 这里将讲述  字符串算法2:Manacher算法 问题:给出字符串S(限制见后)求出最大回文子串长度 Subtask1  对于10%的数据 |S|∈(0,100] Subtask2  对于30%的数据|S|∈(0,5000] Subtask3 对于100%的数据|S|∈(0,11000000] Subtask1(10pts):最朴素的暴力 枚举字符串的所有子串,判断其是否回文,时间复

字符串算法—字符串排序(下篇)

本文将介绍3区基数快速排序.后缀排序法. 1.  前文回顾 在字符串算法-字符串排序(上篇)中,我们介绍了键索引计数法.LSD基数排序.MSD基数排序. 但LSD基数排序要求需排序字符串的长度一致:MSD基数排序虽然对字符串的长度没要求,但其递归循环里的每次循环都需要进行很多操作,且需要额外的空间. 本文将介绍一种更高效的字符串排序方法:结合MSD基数排序和3区快速排序.如果对这两种算法不熟悉的,建议先去了解一下. 2. 3区基数快速排序(3-way radix quicksort) 从例子入手

最大回文字符串算法详解与优化

背景 最近开始研究算法,于是在leetcode上做算法题,第五题Longest Palindromic Substring便是关于回文子串的. 什么是回文字串 回文字符串是指将该字符串前后颠倒之后和该字符串一样的字符串.例如:a,aaaa,aba,abba- 最长回文子串 要求最长回文子串,就需要遍历每一个子串,时间复杂度是O(N2):判断字串是不是回文,时间复杂度是O(N),这样的话算法的时间复杂度就是O(N3). 我刚开始想到的就是中心扩展法,代码如下: public static Stri

【转】各种字符串算法大总结

字符串:KMP Eentend-Kmp 自动机 trie图 trie树 后缀树 后缀数组 2009-09-25 00:00:40|  分类: 算法与acm|举报|字号 订阅 涉及到字符串的问题,无外乎这样一些算法和数据结构:自动机 KMP算法 Extend-KMP 后缀树 后缀数组 trie树 trie图及其应用.当然这些都是比较高级的数据结构和算法,而这里面最常用和最熟悉的大概是kmp,即使如此还是有相当一部分人也不理解kmp,更别说其他的了.当然一般的字符串问题中,我们只要用简单的暴力算法就