二进制字符串中最长的非增加子序列
给定一个二进制串S.的大小N,任务是找到最长的非增加随后的长度在给定的字符串中S.。
例子:
输入:S =“0101110110100001011”
输出:12
解释:最长的非增加子序列是“111111100000”,长度等于12。输入:s = 10101.
输出:3.
方法:给定的问题可以根据观察到的弦S.是一个二进制字符串,所以不增加的子序列将始终包含0.以多次连续1或1以多次连续0。按照以下步骤解决问题:
- 初始化一个数组说,前[],存储数量1直到每个索引一世为了一世在范围内[0,n - 1]。
- 初始化一个数组说,邮政[],存储数量0直到每个索引一世在字符串的末尾一世在范围内[0,n - 1]。
- 例如,初始化一个变量答这是一个商店最长的非增加随后的长度在给定的字符串中S.。
- 在范围内迭代[0,n - 1]并更新值答最大限度地答和(前[我]+[我])后。
- 完成上述步骤后,打印值答作为结果。
以下是实施上述方法:
C ++
// c++程序的上述方法
# include <比特/ stdc + + . h >
使用
名称空间
性病;
//函数找到长度
//最长的非递增子序列
int
findLength(string str,
int
ñ)
{
//存储前缀和后缀
//分别为1s和0s
int
pre [n],帖子[n];
//初始化数组
Memset.
(以前,0,
运算符
(前));
Memset.
(帖子,0,
运算符
(post));
//存储'1'的个数
//最新到当前索引i
为了
(
int
我= 0;我
//找到前缀和
如果
(i != 0) {
pre [i] + = pre [i - 1];
}
//如果当前元素
//是'1',更新前[i]
如果
(str [i] ==
'1'
) {
前[我]+ = 1;
}
}
//存储'0的0
//取值范围[i, N - 1]
为了
(
int
我= n - 1;我> = 0;一世 - ) {
//查找后缀sum
如果
(i!= n - 1)
发布[i] + = post [i + 1];
//如果当前元素
//是0,更新post[i]
如果
(str [i] ==
'0'
)
发布[i] + = 1;
}
//存储最大长度
int
ans = 0;
//求最大值
// pre [i] +帖子[i]
为了
(
int
我= 0;我
ans = max(ans,pre [i] + post [i]);
}
//退回答案
返回
答;
}
/ /驱动程序代码
int
main ()
{
string s =
“0101110110100001011”
;
cout << findLength(S, S.length());
返回
0;
}
|
输出:
12
时间复杂性:上)
辅助空间:上)
注意读者!现在不要停止学习。掌握与竞争性规划的所有重要数学概念CP课程的基本数学以学生友好188bet2021欧洲杯的价格。要完成您的准备,请从学习语言到DS ALGO等等,请参阅完成面试准备课程金宝搏188beat。