输入一字符串,然后将该字符串中的单词分割开来
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
char str[1000];
gets(str);
int n=strlen(str);
for(int i=0;i<n;i++){
int j=i;
while(str[j]!=' '&&j<n) j++;
for(int k=i;k<j;k++) cout << str[k];
cout << endl;
i=j;
}
return 0;
}
//有的C++编译器已无法编译gets,可用Dev++运行该代码
最长连续不重复子序列
给定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。
输入格式
第一行包含整数 n。
第二行包含 n 个整数(均在 0∼105 范围内),表示整数序列。
输出格式
共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。
数据范围
1≤n≤105
输入样例:5
1 2 2 3 5
1
2
输出样例:3
思路:从暴力到双指针思想
i:0-n-1
j:i开始往左能走到什么地方
s[]用来记录a[i]出现的次数
#include <iostream>
using namespace std;
const int N=100010;
int n;
int a[N],s[N];
int main(){
cin >> n;
for(int i=0;i<n;i++){
cin >>a[i];
}
int ans=0;
for(int i=0,j=0;i<n;i++){
s[a[i]]++; //将新的a[i]加进来
while(s[a[i]]>1){
//如果有重复的情况,则将a[j]从[j,i]序列中去除,直到去除重复部分,最后保留j 到 i这一区间(重复数字的下一个到i这一区间)
s[a[j]]--;
j++;
}
ans=max(ans,i-j+1);
}
cout << ans <<endl;
return 0;
}
区间合并算法
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef pair<int,int>PII;
const int N=100010;
int n;
vector<PII> segs;
void merge(vector<PII> &segs){
vector<PII> res;
sort(segs.begin(),segs.end());
int st= -2e9,ed=-2e9; //设置要维护的区间的起始状态为无穷
for(auto seg : segs){
if(ed<seg.first){
if(ed!= -2e9) res.push_back({st,ed});
st=seg.first,ed=seg.second;
}else{
ed= max(ed,seg.second);
}
}
if(st != -2e9) res.push_back({st,ed});
segs=res;
}
int main(){
cin >>n;
for(int i=0;i<n;i++){
int l,r;
cin >> l >>r;
segs.push_back({l,r});
}
merge(segs);
cout << segs.size() << endl;
return 0;
}
思路分析:
选用<int,int>型数据结构保存一个区间段的起始,然后加入到动态数组中,按开始的端的大小进行排序。然后枚举区间A是否可以合并,
设置并维护一个区间A:
若一区间B的起始大于A的末尾,则无法合并,则保存A区间,取B为A的新区间,要注意初始区间的处理,A.ed是无穷时也要更新A;否则可以合并,合并只需更新A.end,去两区间end的最大值;最后还要检查是否A.start是否为无穷,不是无穷要把最后的A加入到动态数组中