輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串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存在...