1. 程式人生 > 其它 >問題 :給你一個字串s和一個字串p,請問最少去掉s中的多少個字元,才能使得p是s的子串

問題 :給你一個字串s和一個字串p,請問最少去掉s中的多少個字元,才能使得p是s的子串

#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()函式也是快速排序。快速排序不懂的可以看我部落格裡面的 排序演算法 這篇部落格。我感覺我講的還算容易懂。(哈哈哈哈,我膨脹了)