最佳时间内的字符串转换

时间:2017-05-17 08:03:49

标签: arrays string algorithm

说完一句话,í希望以这种方式进行转变:

Miracle => Iraclemend。

基本上把第一个字母附加到最后然后添加结束。

但是,特殊字符必须与单词末尾保持在同一位置

   Britne's => Ritnesben'd

'是从结尾开始的2个位置,所以它必须在转换后的字符串第2个位置,这也适用于UpperCase(但是从字符串的开头)所以

 McBeth  => CbEthmend

我的解决方案如下:

1)循环显示单词并检测UpperCase和特殊字符,    如果它的UpperCase,将字符的索引推入UpperCases数组中    它的特殊字符推送字符和索引到特殊字符串,    如果它上面没有任何内容只是将字符附加到字符串(如果其UpperCase附加其小写变体)

因此英国人将在迈出第一步后成为英国人。使用索引2和char“'”(来自单词的末尾)在specialchars arr

2)变换字符串,以便britnes成为ritnesbend

3)从0循环到单词的长度,每次迭代检查该索引是否匹配来自specialchars或upperCases数组的索引。如果匹配特殊字符添加特殊字符+下一个字符,如果它匹配upperCases添加大写字符版本。

这在O(2k) = O(k)中运行,其中k =单词的长度。

对字符串转换alghoritms没有太多经验,有没有更快的解决方案?

伪代码

 function detetectChars ( word , object )
    for i... word.length
      if  word[i] is spececial 
        object.specials.add( char: word[i] , index:i )
      if  word[i] is upperCase
        object.upper.add(i)

  function addSpecials ( word , object )
     upperIndex = 0;
     specialIndex = 0;
     transformed = "";
     for i... word.length
       if i == object.upper[ upperIndex ] 
         transformed += word[i].toUpper(); upperIndex++;
       if i == object.special[ specialIndex ]
         transformed += object.special[ specialIndex++ ] + word[i]
       else
          transformed += word[i]
    return transformed

感谢您的建议。

1 个答案:

答案 0 :(得分:2)

你可以省去额外的阵列。记下字符串的长度,并一次构建一个字符的结果。存储第一个字符(即将结束)。在遍历字符串时,如果前一个字符是大写字母或特殊字符,请在适当的偏移量处将相应的字符添加到累积解法中。

您可能还想澄清何时大写和特殊字符'最终位置从结束或开始计算。例如,目前看来我们可以对" Si' ng"进行各种解释:

Traversing from the end:
  ingSe'nd

Traversing from the start:
  In'gsend