1. 程式人生 > >C語言-演算法-字串

C語言-演算法-字串

字串操作

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

//字串移位包含問題,比如AABCD前兩位AA移到尾部後BCDAA包含CDAA字串;
bool contain_check()
{
    char s[10] = "AABCD";
    char d[5] = "CDAA";
    int len = strlen(s);
    int i=0;
    for(i=0; i<len; ++i)
    {
       char temp = s[0];
       int j=0;
       for(j=0; j<len-1; ++j)
            s[j] = s[j+1];
       s[len-1] = temp;
       if(strstr(s,d) != 0)
       {
       		printf("check OK,s=%s <- d=%s\n",s,d);
            return true;
       }
    }
    printf("check NO,s=%s !~ d=%s\n",s,d);
    return false;
}

//求一個字串中出現頻率最高的那個字元及其出現次數
void get_most(char *s, char &ch, int &size)
{
    ch = '\0';
    size = 0;
    if (NULL != s)
    {
        int n[256];
        memset(n, 0, sizeof(n));
        while(*s != '\0')
        {
            n[*s+128] += 1;
            if((n[*s+128]) > size)
            {
                size = n[*s+128];
                ch = *s;
            }
            s++;
        }
    }
}
void exe_get_most()
{
	char p[]="aaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";
	char ch;
	int size;
	get_most(p, ch,size);
	printf("%c,%d\n", ch,size);
}

//給一個字串,有大小寫字母,要求寫一個函式把小寫字母放在前面,大寫字母放在後面,儘量使用最小的空間、時間複雜度。
void move_char(char* a)
{
    char* i = a;
    char* j = a+strlen(a)-1;
    while(i < j)
    {
        while(*i && (*i>='a' && *i<='z'))
            ++i;
        if((*i) == '\0') break;
        while(*j>='A' && *j<='Z')
            --j;
        if(i < j)
        {
            char c = *i;
            *i = *j;
            *j = c;
        }
        ++i; --j;
    }
}
void exe_move_char()
{
	char p[]="AeBCDabcd";
	move_char(p);
	printf("%s\n", p);
}

//求1,2...n的無重複且無序的陣列排序,時間複雜度O(n),空間複雜度O(L),一次只能交換兩個數。
void FunSort1ton()
{
    int a[]={10,6,9,5,2,8,4,7,1,3};
    int len=sizeof(a)/sizeof(int);
    int tmp;
    int i;
    for(i=0;i<len;)
    {
        tmp=a[a[i]-1];
        a[a[i]-1]=a[i];
        a[i]=tmp;
        if(a[i] == i+1)
            i++;
    }
    for(i=0;i<len;i++)
        printf("%d ", a[i]);
    printf("\n");
}

void FunStrInvert(char *str)//字串倒序,不使用額外空間,如abcd為dcba。
{
    int len=strlen(str);
    char tmp;
    int i;
    for(i=0;i<len/2;i++)
    {
        tmp=str[i];
        str[i]=str[len-i-1];
        str[len-i-1]=tmp;
    }
}
void FunStrInvert_Exe()
{
    char str[]="abcd";
    FunStrInvert(str);
    printf("%s\n", str);
}


int main()
{
	FunStrInvert_Exe();
	return 0;
}