資料結構與演算法——字典序最小問題(用string類實現)

readyao發表於2015-12-13



思路:將源字串str反轉得到 rstr;然後比較兩個字串的大小,比如,如果str小,則將str的第一個字元加入min_str的後面,並將str的第一個字元刪除;直到min_str的長度等於str;

主要是學習string類的成員函式:begin(), end(), rbegin(), rend(), front(), erase(), push_back();



linux程式碼以及執行結果:

/*************************************************************************
    > File Name: best_cow_line.cpp
    > Author: 
    > Mail:  
    > Created Time: 2015年12月13日 星期日 16時51分44秒
 ************************************************************************/

#include<iostream>
#include <string>
using namespace std;

/*輸入資料*/
int input_data(int * len, string & str)
{
	cout << "string length: ";
	cin >> *len;
	cout << "string: ";
	cin >> str;

	return 0;
}
/*該函式僅僅是用於驗證輸入的資料是否正確*/
void output_data(int *len, string & str)
{
	cout << "string length is " << *len << endl;
	cout << "string is " << str << endl;
}

/*得到最小的字串*/
void solve(int *len, string & str, string & min_str)
{
	string rstr(str.rbegin(), str.rend());
//	cout << "rstr is " << rstr << endl;
	int num = *len;

	while(num > 0){
		if(str < rstr){      //如果求最大字串,應該為str > rstr
			//min_str.push_back(str.front());
			min_str.push_back(*str.begin());
			str.erase(str.begin());
		}
		else{
			min_str.push_back(*rstr.begin());
			rstr.erase(rstr.begin());
		}
		num--;
	}
}

int main()
{
	int str_len = 0;
	string str;
	string min_str;
	int ret = 0;

	ret = input_data(&str_len, str);
	if(ret < 0){
		cout << "input the data error" << endl;
	}

	solve(&str_len, str, min_str);
	cout << "min str is: " << min_str << endl;
//	cout << "output the data: " << endl;
//	output_data(&str_len, str);
	
	return 0;
}



windows系統下:

/*************************************************************************
> File Name: best_cow_line.cpp
> Author:
> Mail:
> Created Time: 2015年12月13日 星期日 16時51分44秒
************************************************************************/

#include<iostream>
#include <string>
using namespace std;

/*輸入資料*/
int input_data(int * len, string & str)
{
	cout << "string length: ";
	cin >> *len;
	cout << "string: ";
	cin >> str;

	return 0;
}
/*該函式僅僅是用於驗證輸入的資料是否正確*/
void output_data(int *len, string & str)
{
	cout << "string length is " << *len << endl;
	cout << "string is " << str << endl;
}

/*得到最小的字串*/
void solve(int *len, string & str, string & min_str)
{
	string rstr(str.rbegin(), str.rend());
	//	cout << "rstr is " << rstr << endl;
	int num = *len;

	while (num > 0){
		if (str < rstr){      //如果求最大字串,應該為str > rstr
			min_str.push_back(str.front());//在linux下面沒有該c++11加入的函式
			//min_str.push_back(*str.begin());
			str.erase(str.begin());
		}
		else{
			min_str.push_back(rstr.front());
			//min_str.push_back(*rstr.begin());
			rstr.erase(rstr.begin());
		}
		num--;
	}
}

int main()
{
	int str_len = 0;
	string str;
	string min_str;
	int ret = 0;

	ret = input_data(&str_len, str);
	if (ret < 0){
		cout << "input the data error" << endl;
	}

	solve(&str_len, str, min_str);
	cout << "min str is: " << min_str << endl;
	//	cout << "output the data: " << endl;
	//	output_data(&str_len, str);

	system("pause");
	return 0;
}




相關文章