字串知識及演算法

2021-10-22 17:41:26 字數 3781 閱讀 9313

c語言程式設計

一.字串

1.字串的隨機字母賦值

a:65 a:97

(1).程式:

#include

#include

#include

int main()

(2).函式作用

a.rand():產生符合正太分布的整數

rand()%26(對26取餘,產生數字在0-25),伴隨記憶體清空隨機,每開關機一次便一次

b.srand():用於控制rand()隨機數產生的種子數,預設為1

c.time():產生系統編譯執行時刻的時間

『\0』=0,字串陣列遇0結束,『0』=48

2.字串函式

(1).字串長度統計函式

a.格式:strlen(首位址)

strlen與內容有關,sizeof與空間有關

b.作用:計算字串中結束符之前的有效字元個數

c.例:

char s[20];

gets(s);

printf("%d,%d",strlen(s),sizeof(s)); 5 , 20

d.注意

(a).strlen(s):字串結束符的下標

(b).strlen(s)-1:字串最後乙個有效字元的下標

(d).s[strlen(s)-1]:字串最後乙個有效字元的內容

三大區:靜態儲存區,唯讀屬性

記憶體堆疊區

程式**區

(2).字串拷貝函式

b.作用:將串2連同結束符一起從串1的0下標開始覆蓋

c.注意

(b).不允許疊加拷貝,如:

char s[20]=」china」;

strcpy(s,s+1);

(3).字串連線函式

b.作用:將串2連同結束符一起從串1的結束符位置開始覆蓋

(4).字串比較函式b.作用:按照ascii值大小比較2個串的大小,比較大小時「一戰定勝負」。

d.例:

char s[20]=「big」;

char t[20]=「small」;

if(strcmp(s,t)>0)

puts(s);

else

puts(t)

(5).字串逆置函式

b.作用:將字串進行倒置

3.字串例項

(1).字串統計

a.例1:統計字串中英文單詞個數

(b).

char s[40];

int i,t=0;

gets(s);

for(i=0;s[i];i++)

printf(「單詞個數=%d」,t);

b.例2:統計字串中大寫字母的個數,儲存在int b[26]中,且字母個數與陣列順序相同

char s[40];

int b[26]=;

int i;

gets(s);

for(i=0;s[i];i++)

if(s[i]>=『a』 && s[i]<=『z』)

b[s[i]-『a』]++;

for(i=0;i<26;i++)

printf("%d ",b[i]);

(2).字串改寫

a.例1:將字串ascii碼為奇數,下標為偶數的儲存到另乙個串中

char s[40],t[40];

int i,j=0;

gets(s);

for(i=0;s[i];i++)

if(s[i]%2= =1 & & i%2==0 )

t[j++]=s[i];

t[j]=0; /t串補上結束符/

puts(t);

b.例2:判斷回文字串

char s[40],t[40];

gets(s);

strcpy(t,s);

strrev(t);

if(strcmp(s,t)==0)

printf(「回文串」);

else

printf(「普通串」);

(3).字串刪除

a.例:abcd

e*****

b.刪除全部星號

c.刪除前導星號

d.刪除後導星號

e.使前導星號不得多於n個

f.使後導星號不得多於n個

//字串的隨機字母賦值

#include

#include

#include

intmain

(void)

s[10]=

0;puts

(s);

}// rand():產生符合正態分佈的整數

// srand():用於控制rand()隨機產生的種子數,預設為1

//time():產生系統編譯執行時刻的時間

//刪除字串中的x;

//第一種做法,遇見待刪字元,將後面字串整體賦值,如果不是,加加

#include

#define

n1000

#include

intmain

(void)}

else

}puts

(s);

}//第二種做法,遍歷迴圈,如果遇到不是待刪字元,將該字元賦給乙個指標,兩個加加,如果是,改下標繼續加加

#include

#define

n1000

#include

intmain

(void

)else

} s[j]=0

;puts

(s);

}//字串的統計(統計字串中英文單詞的個數)

#include

#include

intmain

(void

)//字串種當前字元不是空格,並且下乙個字元是空格或者結束符

}printf

("%d"

,t);

return0;

}//統計字串中大寫字母的個數,儲存在int b[26]中,且字母個數與陣列順序相同

#include

#include

intmain

(void);

char s[40]

;int t;

printf

("請輸入你所要判斷的字串");

gets

(s);

for(

int i=

0;s[i]

;i++)}

for(

int i=

0;i<

26;i++)}

判斷回文字串,可使用strrev逆置函式;**

***hhdkgh*

**ilv***

****

刪除全部星號,即使用上面字串的刪除兩種方法

刪除前導星號,定位第乙個非*字元,然後從第乙個非*字元從0下標錯位覆蓋

刪除後導星號,定位最後乙個有效字元,後導*中左起第乙個*補結束符

使前導*不得多於n個,首先計算前導*個數,計算保留*中第乙個*下標,進行覆蓋

使後導*不得多於n個,記錄個數,計算下標,補結束符

字串演算法KMP(字串匹配)板子及理解

下面是求next陣列的板子 void getnext char b 整個過程就相當於對自己和自己用kmp演算法,但是其中乙個自己要在另乙個自己前面乙個元素進行匹配。else k nx k 元素不相等k就回溯,由於j在k前面,所以此時nx k 是已經被算出來了的。下面是kmp演算法的板子 a是主串,b...

《演算法》 字串 字串排序

輸入字串和字串對應的組別 組別也是字串的鍵 在滿足組別有小到大排序的情況下,將字串按字母順序排序 第一步,記錄組別的頻率 為了得到某個字串在排序後的範圍,比如組別2肯定在組別1後面,在組別3前面,把每個組別有多少個人記錄下來,方便我們定位 第三步,分類 該組別的位置起點 向後挪一位 因為當前位被用了...

字串演算法 字串雜湊

方法以,m進製的形式來表示乙個字串,那麼這個字串就可以輕鬆計算 i j 之間的hash值 當只有小寫 大家字母時,m 131 而hash值,可以使用unsigned long long 來表示,這時不再需要求餘 方法應用 字串匹配。思路 對比hash值 允許k次失配的字串匹配 即 允許k次字元值不對...