编程语言
首页 > 编程语言> > PHP-查找仅出现一次的字符串中的字符

PHP-查找仅出现一次的字符串中的字符

作者:互联网

我正在用PHP编写算法来解决给定的数独难题.我已经建立了一个有点面向对象的实现,它具有两个类:9×9板上每个独立图块的Square类,以及Sudoku类,其中Sudoku类具有表示该板的Squares矩阵.

我正在使用的算法的实现是一种三层方法.第一步将仅解决最基本的难题(但最有效),即根据电路板的初始设置填写只能取单个值的任何正方形,并相应调整其余部分的约束.未解决的正方形.

通常,这种“不断传播”的过程并不能完全解决电路板问题,但是可以解决相当大的一块问题.然后第二层开始.这将解析每个未解决的正方形的“可能”值的每个单位(或9个正方形,必须全部具有唯一的数字分配,例如,一行或一列).此可能值列表在Square类中以字符串表示:

class Square {

private $name;                // 00, 01, 02, ... , 86, 87, 88
private $peers;               // All squares in same row, col, and box
private $number;              // Assigned value (0 if not assigned)
private $possibles;           // String of possible numbers (1-9)

public function __construct($name, $p = 0) {
  $this->name = $name;
  $this->setNumber($p);
  if ($p == 0) {
    $this->possibles = "123456789";
  }
}

// ... other functions

给定一个单元中未解决的正方形的整个数组(如上面第二层中所述),第二层将把所有“可能”的字符串连接到一个字符串中.然后,它将在该单个字符串中搜索任何唯一的字符值-不会重复自身的值.这将表明,在平方单位内,只有一个平方可以采用该特定值.

我的问题是:对于实现第二层,我如何解析一个单元中所有可能值的字符串,并轻松检测唯一值?我知道我可以创建一个数组,其中每个索引都由数字1-9表示,并且我可以为找到的该数字的每个可能值将对应索引处的值加1,然后再次扫描该数组以查找值1,但这似乎效率极低,每个单位需要对阵列进行两次线性扫描,而Sudoku拼图中有27个单位.

解决方法:

这有点像您已经排除的“极端低效”,但具有内置功能,因此效率可能很高:

$all_possibilities = "1234567891234";
$unique = array();
foreach (count_chars($all_possibilities, 1) as $c => $occurrences) {
  if ($occurrences == 1)
    $unique[] = chr($c);
}
print join("", $unique) . "\n";

印刷:“ 56789”

标签:sudoku,php,algorithm
来源: https://codeday.me/bug/20191108/2004633.html