日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

双指针扫描

發布時間:2024/1/8 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 双指针扫描 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

來源:牛客網

時間限制: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;
}

總結

以上是生活随笔為你收集整理的双指针扫描的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。