用于分组顺序字符串的算法

时间:2014-10-13 07:02:31

标签: php algorithm sequence

我真的很难设计出一种算法来解决以下问题:

我将接受一系列输入,如下所示:

$input = array('100', '101', '102', '110', '111', '112');

并且输出应该是包含以下内容的字符串:

"100-102, 110-112".

基本上我需要做的是按顺序分组,,如 100到102 ,并将它们组成一个字符串“100-102”因为所有数字都形成一个序列。但由于值 110不在102 旁边,因此应将 110到112的值分组,并形成字符串“110-112”。

输入不限于数字,它们是字符串。所以我期待输入如下:

$input = array('N1', 'N2', 'N3', 'GX1', 'GX2', 'Z-3');

遵循相同的模式,输出应为:

"N1-N3, GX1-GX3, Z-3"

我的伪代码(我是新手)来解决至少数字的问题是:

$sequenceArr = [];
$string = '';
foreach(...){

   if(nextValue == prevValue+1){
      $sequenceArr[] = nextValue;
   }else{
      //form the string from the sequenceArr
      //if the preceeding string doesn't conform to the pattern anymore.
   }
}

我认为我将面临的问题是如果输入没有排序..我可以“排序”它们,但是对于包含字符值的字符串怎么样?我有点迷茫,我不认为我会用这个解决方案去任何地方。

*更新进一步说明:

这只是一个简单的分组算法,只有最后一个数字表示分组,

AB-1-DF AB-2-DF和AB-3-DF将 NOT 分组为AB-1-DF-AB-3-DF。这简化了问题,0前缀也无关紧要,001和002可以分组为1-2。

简单的规则基本上是这样的:

(character) - (number)
  ABC       -     1 

性格上的差异意味着完全不同的东西。

2 个答案:

答案 0 :(得分:1)

使用标准字符串比较谓词(字母顺序)逐渐对数组进行排序。

然后成对比较字符串。

隔离字符串前缀(除了最后一个字符之外的所有字符),并进行相等性比较。

如果您接受由多个数字组成的数字后缀,则需要隔离后缀,将其转换为整数,并对剩余前缀进行比较。 (正则表达式可以帮助你。)

答案 1 :(得分:1)

如果顺序项彼此相邻,这里应该有效。你可能想编写自己的are_sequential函数:

$input = ["1","2","4","6","7","8"];

$len = count($input);
$result = [];

function are_sequential($a,$b){
  return $a + 1 == $b;
}

$i = 0;

while ($i < $len - 1){
  $first = $input[$i];
  $last = $input[$i];
  $i++;
  $sequenceLength = 1;
  while (are_sequential($last, $input[$i])){
    $last = $input[$i];
    $sequenceLength++;
    if ($i < $len - 1){
      $i++;
    }
  }
  if ($sequenceLength > 1){
    $result[] = $first . "-" . $last;
  } else {
    $result[] = $first;
  }
}

var_dump($result);

输出:

array(3) {
  [0]=>
  string(3) "1-2"
  [1]=>
  string(1) "4"
  [2]=>
  string(3) "6-8"
}