字符串問題

1.多型數據類型是指包含的數據元素的類型並不肯定。數組

好比棧能夠是整數棧、字符棧、對象棧等等。安全

可是字符串,它的元素必然是字符。ide


2.兩個長度不相同的串不可能相等。性能

先判斷長度是否相等,不相等則結果直接爲不相等;ui

長度相等才繼續判斷是否對應位置上的每一個字符串是否相等,若是全部對應位置字符都相等,結果爲相等,不然爲不相等。線程


3.在64位平臺機器下sizeof(string_a),sizeof(string_b)大小分別是對象

  1.char *string_a=(char *)malloc(100*sizeof(char));     8內存

  2.char string_b[100];             100字符串

  

串′ababaaababaa′的next數組爲011234223456。string

   i     0    1    2    3    4    5   6   7    8   9   10  11

   s     a    b    a    b    a    a   a   b    a   b   a    a  

next[i]   -1   0    0   1     2    3   1   1    2    3   4    5

先計算前綴next[i]的值: (字符串匹配是 從頭開始的 和 從尾開始的字符串進行匹配是否重複 )

next[i]的值主要是看s[i]以前的字符串中重複的子串長度。next[0] = -1,定值。  

next[1]是看s[1]以前的字符串「a」中重複的子串長度爲0,故next[1] = 0。

next[2]是看s[2]以前的字符串「ab」中重複的子串長度爲0,故next[2] = 0。

next[3]是看s[3]以前的字符串"aba"中重複的子串長度,s[0]與s[2]重複,長度爲1,故next[3] = 1。

next[4]是看s[4]以前的字符串"abab"中重複的子串長度,s[01]與s[23]重複,長度爲2,故next[4] = 2。

next[5]是看s[5]以前的字符串"ababa"中重複的子串長度,s[012]與s[234]重複,長度爲3,故next[5] = 3。

next[6]是看s[6]以前的字符串"ababaa"中重複的子串長度,s[0]與s[5]重複(由於多了一個a,沒法找到長度爲3的重複字符串,

這隻能是s[0]和s[5]重複),長度爲1,故next[6] = 1。

一樣的,求next[7]和next[8]、next[9]、 next[10]、 next[11] 分別爲1和二、三、四、5。


next數組下標從1開始計算

next[1] 確定是 0 

next[2] 確定是 1

next[n] 的狀況,將前面n-1個字符,計算從首尾開始組成最大的相同子串的長度,若是找到,那麼next值是該長度加1,不然next值是1。

舉例:

next[6]的計算,字符串第六位是 a ,( ababa a ababaa)

將前面的5個字符,從頭尾開始取4個組成子串比較,若是不相等,則從首尾取3個字符組成子串繼續比較,並以此類推, 

若是一直比較到最後一個字符都不相等,那麼該next值爲1。

4個字符的狀況:abab : baba

3個字符的狀況:aba   :  aba  此時相等,那麼next[6] = 3+1 = 4


4.字符串www.qq.com全部非空子串(兩個子串若是內容相同則只算一個)個數是50

非空子串的個數共有n(n+1)/2=55個,因爲相同子串算一個,因此要減去2個w,一個.,一個ww,一個q,因此還有50個。

要求的是子串,從左到右一次截取, 10個字符的子串,1個; 9個字符的子串,2個; 

8--------3個, 7---------4個, ......... 1-----------10個 

共有:1+2+3+...+10=10*(10+1)/2=55 

減去重複的: 1個字符時有3個w,2個q,2個. 2個字符時有2個ww 故應減去:(2+1+1+1)=5 答案:55-5=50。


5.設棧的初始狀態爲空,當字符序列a3_做爲棧的輸入時,輸出長度爲3的且能夠用做C語言標識符的字符串序列有3個。

分別是:a3_.a_3,_3a.

首先,棧的順序是先進後出

字符序列爲a3_   1)a入棧,再出棧,而後3入棧,再出棧,—入棧,再出棧   序列是a3_

                           2)a入棧,再出棧,而後3,—入棧,再出棧,序列是a_3

                           3)a入棧,3入棧,再出棧,a出棧, —入棧,再出棧   序列是3a_

                           4) a入棧,3入棧,再出棧, —入棧,序列是3_a

                           5) a入棧,3入棧,_入棧,序列是_3a

其次,C語言的標識符不能以數字開頭,去除3a_和3_a   答案爲3。


6.String str = new String(「abc」),「abc」在內存中的分配是堆,字符串常量區。

當你new String("abc")時,其實會先在字符串常量區生成一個abc的對象,而後new String()時會在堆中分配空間,

而後此時會把字符串常量區中abc複製一個給堆中的String,故abc應該在堆中和字符串常量區。


7."abc"+"def"則會建立三個字符串對象,第三個是"abcdef"。也就是說,在Java中對字符串的一切操做,都會產生一個新的字符串對象。

StringBuffer是線程安全的,它比String快。 一、三者執行速度:StringBuilder > StringBuffer > String ;

二、StringBuilder:線程非安全的;

三、StringBuffer:線程安全的;

四、用String操做字符串時,其實是在不斷地建立新對象,而原來的對象會做爲垃圾被回收;

(1)String建立字符串是不可變的,任何對String的改變都會引起新的String對象的生成;

(2)StringBuffer是可變的,任何對它所指代的字符串的改變都不會產生新的對象; 因此,當改變字符串的內容時,StringBuffer能得到更好的性能;

(3)StringBuilder類不是線程安全的,但其在單線程中的性能比StringBuffer高;


8.中綴表達式(a+b)*c*(d-e/f) 轉成後綴  ab+c*def/-*。

中綴表達式轉後綴表達式的方法:

1.遇到操做數:直接輸出(添加到後綴表達式中)

2.棧爲空時,遇到運算符,直接入棧

3.遇到左括號:將其入棧

4.遇到右括號:執行出棧操做,並將出棧的元素輸出,直到彈出棧的是左括號,括號不輸出。

5.遇到其餘運算符:加減乘除:彈出全部優先級大於或者等於該運算符的棧頂元素,而後將該運算符入棧

6.最終將棧中的元素依次出棧,輸出。


9.串是一種特殊的線性表,其特殊性體如今數據元素是一個字符.

串就是字符串,是一種特殊的線性表,它的每一個結點僅由一個字符組成。

串值也可用鏈表來存儲,因爲串的數據元素是一個字符,它只有8位二進制數, 所以用鏈表存儲時,一般一個結點中存放的不是一個字符,而是一個子串,例如: 在編輯系統中,整個文本編輯區能夠當作是一個串,每一行是一個子串,構成一個結點。


10.字符串一般採用的兩種存儲方式是順序存儲和鏈式存儲.

順序存儲和鏈式存儲時兩種最基本的存儲結構,字符串一般採用順序存儲,可是字符串較長而沒有那麼大的連續空間時,能夠把一個字符串分紅多個小串,串與串之間採用鏈式存儲.


11.串的長度:串中字符數目 n 稱爲串的長度;串長度是指串中全部字符的個數。

零個字符的串稱爲空串,長度爲零。


12.在C語音中有:

string 和 int 型都支持直接加減

'C'+'8'-'3'= 'C'+'5',因爲'C'+1='D',因此結果爲char 'H' => %c;

‘9’-‘0’:平時寫代碼的時候常常int(0~9)轉換char就用的+'0',所以結果直接就是int 9 => %d。

相關文章
相關標籤/搜索