資料結構 串

2021-07-15 06:27:26 字數 4369 閱讀 1336

輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。 結果請按字母順序輸出。

我們求整個字串的排列,可以看成兩步:首先求所有可能出現在第乙個位置的字元,即把第乙個字元和後面所有的字元交換。第二步固定第乙個字元,求後面所有字元的排列。這個時候我們仍把後面所有的字元分成兩部分:後面字元的第乙個字元,以及這個字元之後的所有字串。然後把第乙個字元逐一和他後面的字元交換。

全排列問題。可以參考:全排列演算法及實現

class solution 

permutationhelp(result, 0, str);

return result;

}void permutationhelp(vector

&ans, int k, string str) // 遍歷第k位所有的可能

unordered_set

us; //記錄出現的字元

sort(str.begin() + k,str.end());

// 遍歷第k位的所有可能

for (int i = k; i <= str.size()-1; i++)

}}};

牛客最近來了乙個新員工fish,每天早晨總是會拿著一本英文雜誌,寫些句子在本子上。同事cat對fish寫的內容頗感興趣,有一天他向fish借來翻看,但卻讀不懂它的意思。例如,「student. a am i」。後來才意識到,這傢伙原來把句子單詞的順序翻轉了,正確的句子應該是「i am a student.」。cat對一一的翻轉這些單詞順序可不在行,你能幫助他麼?

解法1:

class

solution

// 乙個字元乙個字元處理

string tmp = "";

string result = "";

for (int i = 0; i < str.length(); i++) else

}if (tmp.length() > 0)

return result;

}};

解法2:

兩次翻轉,第一步翻轉句子中所有的字元。比如翻轉」i am a student.」中所有的字元得到」.tneduts a ma i」,此時不但翻轉了句子中單詞的順序,連單詞的字元順序也被翻轉了。第二步在翻轉每個單詞中字元的順序,就得到了」student. a am i」。

class

solution

int startindex = 0;

int endindex = str.length() - 1;

while (startindex < endindex)

return

str;

} string reversesentence(string str)

// 先翻轉整個字串

string resverstr = reverse(str);

// 乙個字元乙個字元處理

string tmp = "";

string result = "";

for (int i = 0; i < resverstr.length(); i++) else

}if (tmp.length() > 0)

return result;

}};

組合語言中有一種移位指令叫做迴圈左移(rol),現在有個簡單的任務,就是用字串模擬這個指令的運算結果。對於乙個給定的字串行s,請你把其迴圈左移k位後的序列輸出。例如,字串行s=」abcxyzdef」,要求輸出迴圈左移3位後的結果,即「xyzdefabc」。是不是很簡單?ok,搞定它!

以」abcdefg」為例,我們可以把它分為兩部分。由於想把它的前兩個字元移到後面,我們就把前兩個字元分到第一部分,把後面的所有字元都分到第二部分。我們先分別翻轉這兩部分,於是就得到」bagfedc」。接下來我們再翻轉整個字串,得到的」cdefgab」剛好就是把原始字串左旋轉2位的結果。

class

solution

int startindex = 0;

int endindex = n - 1;

// 先交換前一部分

while (startindex < endindex)

// 再交換後一部分

startindex = n;

endindex = str.length() - 1;

while (startindex < endindex)

// 最後再交換整個字串

startindex = 0;

endindex = str.length() - 1;

while (startindex < endindex)

return

str;

}};

將乙個字串轉換成乙個整數,要求不能使用字串轉換整數的庫函式。

主要考慮各種邊界條件。

class

solution

int number = 0;

int i = 0;

if (str[0] == '+' || str[0] == '-')

for (; i < str.length(); i++) else

}if (str[0] == '-')

return number;

}};

請實現乙個函式用來判斷字串是否表示數值(包括整數和小數)。例如,字串」+100」,」5e2」,」-123」,」3.1416」和」-1e-16」都表示數值。 但是」12e」,」1a3.14」,」1.2.3」,」+-5」和」12e+4.3」都不是。

class solution 

}// 用來匹配科學計數法表示的數值的結尾部分

bool i***ponential(char** string)

++(*string);

// 判斷e後面是不是+號或者-號

if (**string == '+' || **string == '-')

if (**string == '\0')

scandigits(string);

return (**string == '\0') ? true:false;

}bool isnumeric(char* string)

if (*string == '+' || *string == '-')

if (*string == '\0')

bool numeric = true;

scandigits(&string);

if (*string != '\0') else

if (*string == '\0')else

}else

if (*string == 'e' || *string == 'e')else

}return numeric;

}};

請實現乙個函式用來匹配包括』.』和』『的正規表示式。模式中的字元』.』表示任意乙個字元,而』『表示它前面的字元可以出現任意次(包含0次)。 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串」aaa」與模式」a.a」和」ab*ac*a」匹配,但是與」aa.a」和」ab*a」均不匹配

class solution 

if (*str != '\0' && *pattern == '\0')

if (*(pattern+1) == '*') else

}if (*str == *pattern || (*pattern == '.' && *str != '\0') )

return

false;

}bool

match(char* str, char* pattern)

return matchcore(str, pattern);

}};

請實現乙個函式用來找出字元流中第乙個只出現一次的字元。例如,當從字元流中只讀出前兩個字元」go」時,第乙個只出現一次的字元是」g」。當從該字元流中讀出前六個字元「google」時,第乙個只出現一次的字元是」l」。

用乙個字典統計字元出現的次數。

class solution

}return

'#';

}};

資料結構 串

串名 串值 串長 空串 空格串。字串的比較 字串模式匹配演算法 1.簡單字串模式匹配演算法 最簡單實現是用字串p的字元依次與字串t中的字元進行比較。實現思想是,首先將子串p從第0個字元起與主串t的第pos個字元起依次比較對應字元,如全部對應相等,則表明已找到匹配,成功終止。否則將子串p從第0個子串起...

資料結構 串

串 又稱字串 是一種特殊的線性表,它的每個結點僅由乙個字元組成。在早期的程式語言中,串僅在輸入或輸出中以直接量的形式出現,並不參與運算。隨著計算機的發展,串在文字編輯 詞法掃瞄 符號處理以及定理證明等許多領域得到越來越廣泛的應用。在高階語言中開始引入了串變數的概念,如同整型 實型變數一樣,串變數也可...

資料結構 串

串 adt string 資料關係 r1 基本操作 strassign t,chars chars是字元常量。生成乙個其值等於chars的串t。strcopy t,s 串s存在則由串s複製得串t strempty s 串s存在則若s為空串,返回真否則返回假 strcompare s,t 串s和t存在...