爪哇8,285个 277字节
import java.util.*;Set r=new HashSet();n->p("",((1<<3*n)+"").replaceAll(".","PRS"),n)void p(String p,String s,int n){int l=s.length(),i=0;if(l<1&&(s=p.substring(0,n)).equals(s.replaceAll("(.*)\\1","")))r.add(s);for(;i<l;p(p+s.charAt(i),s.substring(0,i)+s.substring(++i,l),n));}
尽管Java几乎总是很冗长,但在这种情况下,它绝对不是解决此类挑战的正确语言。用子字符串生成置换对性能不利且效率低下。
当然,可以打更多的球。
-8个字节,感谢@Jakob。
说明:
在这里尝试。(对于3个以上的测试用例,性能太差了,但是它确实可以在本地工作。)
import java.util.*; // Required import for Set and HashSet
Set r=new HashSet(); // Result-Set on class-level
n-> // Method with integer parameter and no return-type
p("",((1<<3*n)+"").replaceAll(".","PRS"),n)
// Get all permutations and save them in the Set
// End of method (implicit / single-line return-statement)
void p(String p,String s,int n){
// Separated method with 2 String & int parameters and no return-type
int l=s.length(), // The length of the second input-String
i=0; // Index-integer, starting at 0
if(l<1 // If the length is 0,
&&(s=p.substring(0,n)).equals(s.replaceAll("(.*)\\1","")))
// and it doesn't contain a repeated part:
r.add(s); // Add it to the result-Set
for(;i<l; // Loop (2) from 0 to `l`
p( // Recursive-call with:
p+s.charAt(i), // Prefix-input + the character of the second input at index `i`
s.substring(0,i)+s.substring(++i,l),
// and the second input except for this character
n) // and `n`
); // End of loop (2)
} // End of separated method
n>3
将是一个好主意,因为关于重复字符与重复序列存在一些混淆。