找出連續同字母排列最長字串

當使用者輸入一個字串時,此程式可以自動回傳出該字串當中連續同字母排列的最長字串。

本文以C++實作執行。

以下是實作"找出連續同字母排列最長字串"實作程式碼:

string longSubstring(string);

string longSubstring(string s)
{
	char indexMax = s[0] ;//存最大的值
	int countMax = 1;//存最大的次數
	char indexTemp ;//存比較的值
	int countTemp = 1;//存比較的次數
	int temp = 0;//存第二個不一樣字元的開始位置
	int finalend;//所需子字串的最末位置


	for (int i = 0; i < s.length(); i++)
	{
		if (s[i] == s[i + 1])//如果下個字元和目前字元相等
		{
			countMax++;
		}
		if (s[i] != s[i + 1])//如果下個字元和目前字元不相等
		{
			indexTemp = s[i + 1];
			temp=i + 1;//紀錄第一個字串之後的下一個字元位置
			break;
		}
	}


	for (; temp < s.length(); temp++)
	{
			
		if (s[temp] == s[temp + 1])//下個字元和目前字元一樣的話 計數加一
		{
			countTemp++;
		}


		if (s[temp] != s[temp + 1])
		{
			if (countTemp >= countMax)//目前計數子字串大於最大子字串時
			{
				countMax = countTemp;
				indexMax = indexTemp;

				if (temp + 1 <= s.length())//排除最後一個字串的下個字元為空的狀況
				{
					indexTemp =s[temp + 1];
					countTemp = 1;
					finalend = temp- countMax+1;//紀錄相同字串的第一個位置
				}
			}
		}	

	}

	return s.substr(finalend,countMax);//回傳字串中最長子字串
}

當中的 substr是string當中的函式,其用法如下:

str.substr(startpos, length);

其中參數startpos是起始字串的,參數length是"從startpos 開始"取的字串長度(包括 startpos )。

完整程式碼如下:

#include <iostream>
#include <cstring>
#include <string>

using namespace std;

string longSubstring(string);

int main() {

	string s;


	cout << "請輸入一個字串:";
	cin>>s;
	
	cout << "原始字串:" << s << endl;
	cout<<"最長子字串:"<<longSubstring(s)<<endl;

	system("pause");
	return 0;
}

string longSubstring(string s)
{
	char indexMax = s[0] ;//存最大的值
	int countMax = 1;//存最大的次數
	char indexTemp ;//存比較的值
	int countTemp = 1;//存比較的次數
	int temp = 0;//存第二個不一樣字元的開始位置
	int finalend;//所需子字串的最末位置


	for (int i = 0; i < s.length(); i++)
	{
		if (s[i] == s[i + 1])//如果下個字元和目前字元相等
		{
			countMax++;
		}
		if (s[i] != s[i + 1])//如果下個字元和目前字元不相等
		{
			indexTemp = s[i + 1];
			temp=i + 1;//紀錄第一個字串之後的下一個字元位置
			break;
		}
	}


	for (; temp < s.length(); temp++)
	{
			
		if (s[temp] == s[temp + 1])//下個字元和目前字元一樣的話 計數加一
		{
			countTemp++;
		}


		if (s[temp] != s[temp + 1])
		{
			if (countTemp >= countMax)//目前計數子字串大於最大子字串時
			{
				countMax = countTemp;
				indexMax = indexTemp;

				if (temp + 1 <= s.length())//排除最後一個字串的下個字元為空的狀況
				{
					indexTemp =s[temp + 1];
					countTemp = 1;
					finalend = temp- countMax+1;//紀錄相同字串的第一個位置
				}
			}
		}	

	}

	return s.substr(finalend,countMax);//回傳字串中最長子字串
}




執行結果如下:

有夢最美 築夢踏實

活在當下 認真過每一天

我是阿夢 也是Ace