1.图片重排,保证每N个数据出现一个图片,第一个图片之前的保持不动。
int main()
{
int n, m;
cin >> n >> m;
vector<string> data(m);
for (int i = 0; i < m; i++)
{
cin >> data[i];
}
if (n == 1)//重要:如果每一个输出一个,直接输出原数组
{
cout << data.size() << endl;
for (int i = 0; i < m; i++)
{
cout << data[i] << endl;
}
return 0;
}
vector<string> res;
vector<string> helper1;
vector<string> helper2;
int p = -1;
for (int i = 0; i < m; i++)
{
//出现第一个P之前保存原本的值
if (p==-1&&data[i][0] == 'V')
{
res.push_back(data[i]);
}
else if(p==-1&&data[i][0]=='P')
{
res.push_back(data[i]);
p = i;
}
//第一个P出现之后将P和V保存在两个数组中
else
{
if (data[i][0] == 'V')
{
helper1.push_back(data[i]);
}
else
{
helper2.push_back(data[i]);
}
}
}
p = 0;
int v = 0;
while (v < helper1.size() && p < helper2.size())
{
//加入视频
bool flag = false;
for (int i = 0; i < n - 1; i++)
{
res.push_back(helper1[v++]);
if (v == helper1.size())
{
flag = true;
break;
}
}
if (flag)
{
break;
}
//加入图片
res.push_back(helper2[p++]);
}
while (v < helper1.size())
{
res.push_back(helper1[v++]);
}
cout << res.size() << endl;
for (int i = 0; i < res.size(); i++)
{
cout << res[i] << endl;
}
return 0;
}
2.最长不包含重复字符串的子字符串
int main()
{
string str;
cin >> str;
int length = str.length();
int res = -1;//结果
int curlength = 0;
map<int, int> m;
for (int i = 0; i < length; i++)
{
m[str[i]] = -1;//初始化
}
for (int i = 0; i < length; i++)
{
int preIndex = m[str[i]];
if (preIndex<0 || i - preIndex>curlength)//当前字符没有出现过或者出现的间隔大于f(i-1)
{
curlength++;
}
else
{
if (curlength > res)
{
res = curlength;
}
curlength = i - preIndex;//当前最大的长度为当前字符位置减去上次出现的位置
}
m[str[i]] = i;
}
if (curlength > res)
{
res = curlength;
}
cout << res << endl;
return 0;
}
或更简单的方法:
int main()
{
string str;
cin >> str;
if (str.size() == 0)
{
cout << 0 << endl;
return 0;
}
int res = 1;
unordered_map<char, int> map;//存储索引
//map[str[0]] = 0;
int j = 0;
for (int i = 0; i < str.size(); i++)
{
char ch = str[i];//当前字符
if (map.count(ch) > 0)
{
j = max(j, map[ch] + 1);
}
map[ch] = i;
res = max(res, i - j + 1);
}
cout << res << endl;
return 0;
}