zoukankan      html  css  js  c++  java
  • 关于字符串的一些算法

    代码
    // programmer_string_test.cpp : 定义控制台应用程序的入口点。
    //

    #include 
    "stdafx.h"
    #include 
    "stdio.h"
    #include 
    <iostream>
    #include 
    "assert.h"
    #include 
    <string>
    using namespace std;
    #define MAX 50

    /*不用itoa函数,将整数转化成字符串数*/
    void itoa_test()
    {
        
    int num,i,j=0;
        
    char a[MAX],b[MAX];
        cout 
    << "please input a interger:" << endl;
        cin 
    >> num;
        
    while(num)
        {
            i
    =num%10;
            a[j]
    =i+'0';
            j
    ++;
            num
    /=10;
        };
        a[j]
    ='\0';
        cout 
    << "the inverted string is : " << a << endl;
        
        
    //求出来的a是倒转的,现将其再转回去
        for(j=0;j<strlen(a);j++)
        {
            b[j]
    =a[strlen(a)-j-1];
        }
        b[j]
    ='\0';

        cout 
    << " the converted string is :" << endl
            
    << b << endl;
    }

    /* 不用atoi函数,将字符串转换成整数*/
    void atoi_test()
    {
        cout 
    << " atoi_test: " << endl;
        
    char a[MAX];
        
    int i,num=0,len;
        cout 
    << "please input a num string: " << endl;
        cin.getline(a,MAX);
        len
    =strlen(a);
        
    for(i=0;i<len;i++)
        {
            num
    =num*10+a[i]-'0';
        }

        cout 
    << " the convered number is " << num << endl;
    }

    /* strcpy test */
    char * strcpy_fun(char *dest, char *src)
    {
        
    int i,len;
        len
    =strlen(src);
        cout 
    <<" the len of src is " << len << endl;
        
    for(i=0;i<len;i++)
            
    *dest++=*src++;
        cout 
    << " i is " << i <<endl;
        dest[i]
    ='\0';
        
    char c;
        
    for(i=0;i<5;i++)
        {
            c
    =dest[i];
            cout 
    << c << endl;
        }
        
    return dest;
    }

    char *strcpy_answer(char *dest, const char *src)
    {
        assert((dest
    !=NULL) && (src !=NULL));
        
    char *address=dest;
        
    while((*dest++=*src++)!='\0');
        
    return address;
    }

    void strcpy_test()
    {
        cout 
    << "strcpy_test: " << endl;
        
    char dest[5],dest1[5],src[5]="hi";
        strcpy_fun(dest,src);
        strcpy_answer(dest1,src);
        
        cout 
    <<" the dest string is " << dest << endl;
        cout 
    <<" the programmer answer is : "<< dest1 <<endl;
    }


    char *string_shift_fun(char *str, int steps)
    {
        
    char tmp[MAX];
        
    int len,i;
        len
    =strlen(str);
        
    for(i=0;i<steps;i++)
            tmp[i]
    =str[len-steps+i];
        
    for(i=0;i<(len-steps);i++)
            tmp[steps
    +i]=str[i];
        tmp[len]
    ='\0';
        strcpy(str,tmp);
        cout 
    << "the tmp is :" <<tmp << endl;
        
    return str;
    }

    void string_shift_answer(char *pStr,int steps)
    {
        
    int n=strlen(pStr)-steps;
        
    char tmp[MAX];
        memcpy(tmp,pStr
    +n,steps);
        memcpy(tmp
    +steps,pStr,n);
        memcpy(pStr,tmp,strlen(pStr));
    }

    void string_shift_test()
    {
        
    /*
        cout << "string_shift_test:" << endl;
        char str[MAX],*str1;
        cin.getline(str,10);
        
    */
        
    char str[]="hello",*str1;
        str1
    =string_shift_fun(str,2);
        
        cout 
    << "the shifted string is:"<< str1 << endl;

        string_shift_answer(str,
    2);
        cout 
    << "shifted angain:the shifted string of programer answer is :" << str << endl;
    }


    //找出字符串中出现的相同且长度最长的字符串,输出它的及其首字符的位置
    int longest_same_string_answer()
    {
        
    string str,tep;
        cout 
    << "please input string :" << endl;
        cin 
    >> str;

        
    for(int i=str.length()-1;i>1;i--)
            
    for(int j=0;j<str.length();j++)
                
    if(j+i<=str.length())
                {
                    size_t t
    =0;
                    size_t num
    =0;
                    tep
    =str.substr(j,i);
                    t
    =str.find(tep);
                    num
    =str.rfind(tep);
                    
    if(t!=num)
                    {
                        cout 
    << tep << " " << t+1 <<endl;
                        
    return 0;
                    }
                }
        
    return 0;
    }

    //返回主串中字符字串以后的所有字符
    int substr_afterstr_fun(char *str,char *substr)
    {
        
    int len,sublen,i=0,j=0;
        len
    =strlen(str);
        sublen
    =strlen(substr);

        
    while(i<len&&j<sublen)
        {
                
    if(str[i]==substr[j])
                {
                    i
    ++;
                    j
    ++;
                }
                
    else
                {
                    i
    =i-j+1;
                    j
    =0;
                }
        }
        
    if(j>=sublen)
            
    return (i-sublen);
    }
        
    void substr_afterstr()
    {
        
    char str[]="hellostrhaha",substr[]="str";
        
    int pos;
        pos
    =substr_afterstr_fun(str,substr);
        cout 
    << "the string begin with the sub string is :" << str+pos << endl;

    }


    //将一句话里的单词倒转,标点符号不倒转
    void invert_fun(char *str)
    {
        
    int len ,i;
        
    char tmp[MAX];
        len
    =strlen(str);
        
    for(i=0;i<len;i++)
            tmp[i]
    =str[len-1-i];
        tmp[len]
    ='\0';
        strcpy(str,tmp);
    }

    void invert_word()
    {
        
    char str[]="I come from tianjin.",tmp[MAX],word[MAX];
        
    int len,i=0,j=0,k,m;
        len
    =strlen(str);
        invert_fun(str);

        cout 
    << "the totally invert string is:"<< str << endl;


        
    while(i<len)
        {
            word[j
    ++]=str[i++];
            
    if(str[i]==' ')
            {
                word[j]
    ='\0';
                invert_fun(word);
                
    for(k=0;k<strlen(word);k++)
                    str[i
    -j+k]=word[k];
                j
    =0;
                i
    ++;
            }
        }

        cout 
    << "the invert string is :" << str << endl;
    }


    int _tmain(int argc, _TCHAR* argv[])
    {
        
    //write a user defined function about itoa
        
    //itoa_test();
        
        
    //
        
    //atoi_test();

        
    //
        
    //strcpy_test();
        
        
    //
        
    //string_shift_test();

        
    //
        
    //longest_same_string_answer();
        
        
    //
        
    //substr_afterstr();

        
    //
        invert_word();
        
    while(1);
        
    return 0;
    }

  • 相关阅读:
    POJ 1469 COURSES 二分图最大匹配
    POJ 1325 Machine Schedule 二分图最大匹配
    USACO Humble Numbers DP?
    SGU 194 Reactor Cooling 带容量上下限制的网络流
    POJ 3084 Panic Room 求最小割
    ZOJ 2587 Unique Attack 判断最小割是否唯一
    Poj 1815 Friendship 枚举+求最小割
    POJ 3308 Paratroopers 最小点权覆盖 求最小割
    1227. Rally Championship
    Etaoin Shrdlu
  • 原文地址:https://www.cnblogs.com/newgreen/p/1853687.html
Copyright © 2011-2022 走看看