在 C++11 中使用字符串如何满足条件?
Posted
技术标签:
【中文标题】在 C++11 中使用字符串如何满足条件?【英文标题】:Working with strings in C++11 how to satisfy conditions? 【发布时间】:2020-08-04 18:01:56 【问题描述】:给定一个字符串,我想检查它是否满足以下条件:
-
仅包含小写字母、大写字母、数字、
[
或 ]
或 ;
如果出现[]
,则必须正确放置它们,换句话说,在每个[
之后有]
,在每个]
之前有[
例如,这是合法的:[x1[x3]]
虽然这不是:[x1]]x2[
-
如果出现
;
,它必须出现在[]
之间
例如,这是合法的:[;;;]
,[a;bb]
虽然这不是:x1[];y "
我已经完成了 1,但卡在了 2 和 3,有什么帮助吗?
【问题讨论】:
这个[[x3[x1
合法吗?它违反了“在每个[
之后有]
”
了解Regex
@churill 和 Thomas 感谢您告诉我!我不知道为什么,但由于某种原因,所有示例都被轮换了(现已修复)
@FarbodAhmadian 正则表达式在您需要匹配打开和关闭时不是一个好的解决方案。
@FarbodAhmadian:现在您谈论的不是正则表达式,而是某些特定正则表达式库支持的扩展(它们绝不是标准化或可移植的)
【参考方案1】:
只需从左到右一次遍历字符串一个字符(ranged-for 对此很有用),并跟踪嵌套级别(不匹配 [
的数量)。
规则1:对性格的明显考验
规则 2:如果[
增加嵌套级别,如果]
减少嵌套级别。如果水平变为负数,那就是错误。如果它在字符串的末尾没有回到零,那就是一个错误。
规则 3:如果 ;
则嵌套级别必须至少为 1,如果(小于或)等于 0 则为错误。
【讨论】:
【参考方案2】:为了跟踪[
和]
,您可以跟踪到目前为止遇到的所有[
,但它们没有匹配的]
。您还可以检查;
是否属于相同的逻辑。
int countBrackets = 0;
for(int i=0;i<strlen(str);i++)
if(str[i] == '[')
countBrackets++;
else if(str[i] == ']')
if(countBrackets == 0) return false;
else countBrackets--;
else if(str[i] == ';')
if(countBrackets == 0) return false;
if(countBrackets > 0) return false;
【讨论】:
干得好@Jasmeet 最初我认为使用堆栈或队列,但这是一个简单明了的想法【参考方案3】:这个想法就像@Jasmeet 但在所有条件下就像@BenVoidt 所说:
bool check(string x)
int bracketSence=0;
for(int i=0; i < x.size(); ++i)
//First Condition
if(islower(x[i]) || isupper(x[i]) || (x[i] >= '0' && x[i]<= '9') ||
x[i] == '[' || x[i] == ']' || x[i] == ';')
//Second and Third Condition
if(x[i] == '[') ++bracketSence;
else if(x[i] == ']') --bracketSence;
else if(x[i] == ';' && bracketSence<1) return false;
if(bracketSence < 0) return false;
else return false;
return bracketSence == 0;
【讨论】:
您好,请问怎么联系您?有 FB 或 Insta(不是出于本代码的目的) 在chat room 或在某个社交网络@DanielRob 中给我您的用户名以上是关于在 C++11 中使用字符串如何满足条件?的主要内容,如果未能解决你的问题,请参考以下文章
如何遍历 2 个文件中的行,比较值并在满足条件时更新文件中的值?