双指针扫描
來源:牛客網
時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 262144K,其他語言524288K
64bit IO Format: %lld
題目描述
給定長度為N的字符串S,要構造一個長度為N的字符串T。T初始是空字符串。S由大寫字母構成。
構造過程通過反復進行以下任意操作:
從S的頭部刪除一個字符,添加到T的尾部
從S的尾部刪除一個字符,添加到T的尾部
請你構造出字典序盡可能小的字符串T(字典序是指首先比較第一個字符,如果不同則第一個字符
較小的字符串更小,如果相同則比較第二個字符,以此類推)
?
輸入描述:
第一行一個整數N,表示字符串的長度(1<=n<=2000) 第二行輸入一個長度為N的字符串S輸出描述:
輸出構造出的盡可能小的字符串T示例1
輸入
6
ACDBCB
輸出
ABCBCD
思路:
主要判斷兩邊相等的情況,每次判斷輸出左指針還是右指針即可;若兩邊不同,輸出字典序小的;若相同,則繼續往中間找(此過程不能移動兩邊指針的位置),直到遇到不同字符再判斷輸出哪一個;
代碼:
#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
using namespace std;
int main()
{
?? ?int n;
?? ?string s;
?? ?cin >> n >> s;
?? ?int left = 0,right = n - 1;//一個左指針,一個右指針;
?? ?int flag;
?? ?flag = 0;
?? ?int i;
?? ?while(left <= right)
?? ?{
?? ??? ?flag = 0;
?? ??? ?for(i = 0;left + i < right;i ++)
?? ??? ?{
?? ??? ??? ?if(s[left + i] < s[right - i])
?? ??? ??? ?{
?? ??? ??? ??? ?flag = 1;//左邊字母小,flag賦1;
?? ??? ??? ??? ?break;
?? ??? ??? ?}
?? ??? ??? ?else if(s[left + i] > s[right - i])
?? ??? ??? ?{
?? ??? ??? ??? ?flag = 0;//右邊字母小,flag賦0;
?? ??? ??? ??? ?break;
?? ??? ??? ?}
?? ??? ?}
?? ??? ?if(flag == 1)
?? ??? ?{
?? ??? ??? ?cout << s[left];
?? ??? ??? ?left ++; //++讓左指針向右掃描;
?? ??? ?}
?? ??? ?else
?? ??? ?{
?? ??? ??? ?cout << s[right];//--讓右指針向左掃描;
?? ??? ??? ?right --;
?? ??? ?}?? ?
?? ?}
??? return 0;
}
總結
- 上一篇: Python OpenCV 正月十五轻松
- 下一篇: 使用记录6_发布微信小游戏