問題 :給你一個字串s和一個字串p,請問最少去掉s中的多少個字元,才能使得p是s的子串
阿新 • • 發佈:2021-06-11
#include<iostream> #include<string> #include <algorithm> using std::cin; using std::cout; using std::endl; using std::string; using std::min_element; using std::sort; int fuc(string s, int subscript, int len, char targetchar) { for (int i = subscript+1; i < len; i++) { if (s[i] == targetchar) return i; } return -1; //-1代表沒有找到目標字元 } //快速排序 void quick_sort(int nums[], int _left, int _right) { int left = _left; int right = _right; int temp = 0; if (left < right) { //如果排序的元素至少有兩個則開始排序,只有一個?直接返回了 temp = nums[left]; //待排序的第一個元素作為基準元素 while (left != right) { //從左右兩邊交替掃描,直到left = right while (right > left && nums[right] >= temp) { right--; //從右往左掃描,找到第一個比基準元素小的元素 } nums[left] = nums[right]; //找到這種元素nums[right]後與nums[left]交換 while (left < right && nums[left] <= temp) { left++; //從左往右掃描,找到第一個比基準元素大的元素 } nums[right] = nums[left]; //找到這種元素nums[left]後,與nums[right]交換 } nums[right] = temp; //基準元素歸位 quick_sort(nums, _left, left - 1); //對基準元素左邊的元素進行遞迴排序 quick_sort(nums, right + 1, _right); //對基準元素右邊的進行遞迴排序 } } int main() { string s,p; cin >> s >> p; int s_len = s.length(); int p_len = p.length(); int a[2001][11],result[2001]; int initials_num=0; //p的首字母在s中出現的次數 //a[j][i]代表第j個方案中p中第i個元素在s中出現的位置的下標 //找出s中有多少個p的首元素,並記錄下在s中的位置,有多少個代表有多少種查詢方案 for (int j = 0; j < s_len; j++) { if (p[0] == s[j]) { a[initials_num][0] = j; initials_num++; } } for (int j = 0; j < initials_num; j++) { result[j] = 0; for (int i = 1; i < p_len; i++) { if (fuc(s, a[j][i-1], s_len, p[i]) != -1) { //找到p[i],則返回下標值 a[j][i] = fuc(s, a[j][i-1], s_len, p[i]); result[j] = result[j] + (a[j][i] - a[j][i-1] - 1); //累計這個方案需要刪除的字元 }else { //沒找到,代表方案失敗。則把a[j][p_len - 1]為一個不可能的數p_len + 1,同時退出這個方案的查詢 a[j][p_len - 1] = p_len + 1; result[j] = s_len + 1; //result[j] 也置為不可能的數s_len + 1; break; } } } //下面三種任選一種都能通過測試 //用自己寫的快速排序排序 quick_sort(result, 0, initials_num-1); //從小到大排序 cout <<result[0]<<endl; //呼叫stl演算法的min_element函式求最小值 /*int* q = min_element(result, result + initials_num); cout << *q <<endl; */ //呼叫stl演算法的sort函式排序 /*sort(result, result + initials_num); cout << result[0] << endl; */ return 0; }
其實 stl演算法裡面的sort()函式也是快速排序。快速排序不懂的可以看我部落格裡面的 排序演算法 這篇部落格。我感覺我講的還算容易懂。(哈哈哈哈,我膨脹了)