首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数学中的字符串验证

问数学中的字符串验证
EN

Stack Overflow用户
提问于 2011-02-28 20:03:15
回答 2查看 197关注 0票数 2

我有一个要优化的字符串验证函数。字符串的长度为2n,由0和1组成,例如str="100001"。我想测试:

( 1)字符串中奇异索引位置中的1's数(必须不小于1)是否等于均匀索引位置中的数字?

2)无论在每一个StringTake[str,2*i]中,i从1到n-1,字符串中奇异索引位置的1数都不等于均匀索引位置中的1数。

总之,我想测试第一次2n的位置是否是,字符串中奇怪索引位置的1数是否等于均匀索引位置中的1数。

"100001"和101101是一个很好的字符串,但不是100100、100000或000000。

非常感谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-28 20:29:19

此代码不测试无效字符串(字符不是"0“或"1",长度不为偶数)。

代码语言:javascript
复制
goodString[str_String] := Module[
  {digits, cumdiffs, pos},
  digits = Transpose[Partition[
    IntegerDigits[ToExpression[str], 10, StringLength[str]], 2]];
  cumdiffs = Subtract @@ Accumulate /@ digits;
  pos = Position[cumdiffs, 0, 1, 1];
  Length[pos] == 1 && pos[[1, 1]] == Length[cumdiffs]
]

你的例子:

代码语言:javascript
复制
goodString /@ {"100001" , "101101", "100100", "100000", "000000"}

Out302= {真,真,假}

可能有更快的方法,例如使用NestList。此外,如果速度是一个大问题,而且字符串可能很长,则可以拆分IntegerDigits[ToExpression.]在预处理和使用编译的馀下。

Daniel Lichtblau研究

票数 5
EN

Stack Overflow用户

发布于 2011-02-28 21:40:43

(对学童代码表示歉意,这是我第一次在数学中使用Strings,所以我在思考时留下了一些注释掉的调试/跟踪值)。

代码语言:javascript
复制
charcountsvec[s_String, c_String] := Table[
   If[StringTake[s, {i, i}] == c, 1, 0]
   , {i, 1, StringLength[s]}
];

oddchars[s_String] := StringTake[s, {1, -1, 2}]; (*pick out odd chars*)    
evenchars[s_String] := StringTake[s, {2, -1, 2}];

validatestr[str_String] :=     
 Block[{evencounts, oddcounts, answer1, answer2 (*, odds, evens*)},
  evencounts = Accumulate@charcountsvec[(*evens=*)evenchars[str], "1"];
  oddcounts = Accumulate@charcountsvec[(*odds=*)oddchars[str], "1"];
  (*my interpretation of "number of 1's in odd positions the same as in even positions"*)      
  answer1 = Last[oddcounts] == Last[evencounts]; 
  (*my interpretation of "for every..string...whether number of 1's in even/odd positions is not equal"*)      
  answer2 = Fold[And, True, 
    MapThread[Unequal, {Most[oddcounts], Most[evencounts]}]];

  {str, And[answer1, answer2](*,odds,evens,oddcounts,evencounts,answer1,answer2*)}
  ];

测试:

代码语言:javascript
复制
validatestr/@{"100001","101101","100100","100000","000000"}

{{"100001",真},{"101101",真},{"100100",假},{"100000",假},{"000000",假}

代码语言:javascript
复制
validatestr["0000001"](*odd length string pukes, and returns False*)

在(本地) In428:= MapThread::mptc计算期间: MapThreadUnequal的{2,1}和{2,2},{0,0,0},{0,0};维度为{3}和{2}的对象的不兼容尺寸。>>

(本地) Out432= {"0000001",False}

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5146944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档