无意间在QQ群里看到这样一个题目:
> 123456+-/只能用一次且全部用上得值为22用程序实现
> 我马上想到我只需要把‘123456+-/’的所用组合方式全部列出来,计算一下就行了,于是我现在需要写一个方法来把任意字符串的所有组合方式列出来
eval: 计算字符串中的表达式
exec: 执行字符串中的语句
execfile: 用来执行一个文件
一个长度单位的序列组合个数为: 1 * 2 * 3 * n
def func(n): r = 1 for i in range(1, n + 1, 1): r *= i return r
传入一个字符串,反回其所有组合方式的列表(长度不能超过9,超过后会很慢):
Python实现
def str_combine(s):
arr = list(s)
r = [arr[0]]
for c in arr[1:]:
tmp = r[:]
r = []
for one in tmp:
for x in range(len(one) + 1):
t = list(one)
t.insert(x, c)
r.append(''.join(t))
return rPHP实现
class Combine
{
public static function xx($str)
{
//最多只能算8位长度,超过会很慢
//$arr = str_split(mb_substr($str, 0, 8, 'utf8'));
$arr = str_split($str);
$r[] = [$arr[0]];
for ($i = 1; $i < count($arr); $i++) {
$zj = $r[$i - 1];
$tmp = [];
for ($j = 0; $j < count($zj); $j++) {
$tmp = array_merge($tmp, self::c($zj[$j], $arr[$i]));
}
$r[$i] = $tmp;
}
return $r;
}
public static function c($str, $c)
{
$combine = [];
$arr = str_split($str);
$len = count($arr);
for ($i = 0; $i <= $len; $i++) {
$tmp = $arr;
array_splice($tmp, $i, 0, $c);
$combine[] = implode('', $tmp);
}
return $combine;
}
}
list($t1, $t2) = explode(' ', microtime());
$r = Combine::xx('123456+-/');
list($t3, $t4) = explode(' ', microtime());
echo ($t4 + $t3) - ($t2 + $t1);