这是最近一次编程采访中提出的一个问题。
给定字符串“str”和一对“N”交换索引,生成按字典顺序排列的最大字符串。交换索引可以重复使用任意次数。
例如:
String = "abdc"
Indices:
(1,4)
(3,4)
答案:
cdba, cbad, dbac,dbca
您应该只打印字典上最大的“dbca”。
这可能听起来很幼稚,但我完全没有回答这个问题。有人可以帮我理解这个问题的含义吗?
答案 0 :(得分:2)
我认为,鉴于字符串mystring = "abdc"
,您被指示在指定的索引对处切换字符,以便您按字典顺序生成"最大的"字符串(即,如果你lex-sorted所有可能的字符串,它将最终在最后一个索引处)。因此,您有两个有效的操作:(1)切换mystring[1]
mystring[4]
("abdc"
- > "cbda"
),以及(2)切换mystring[3]
mystring[4]
("abdc"
- > "abcd"
)。此外,您可以乘以链操作:操作(1)后跟(2)("abdc"
- > "cbda"
- > "cbad"
),反之亦然({{ 1}} - > "abdc"
- > "abcd"
),依此类推等等("dbca"
- > "abdc"
- > {{ 1}} - > "cbda"
)。
然后你(反向)lex-sort这些并弹出顶部索引:
"cbad"
答案 1 :(得分:0)
根据@ncemami的澄清,我提出了这个解决方案。
public static String swap(String str, Pair<Integer, Integer> p1, Pair<Integer, Integer> p2){
TreeSet<String> set = new TreeSet<>();
String s1 = swap(str, p1.getKey(), p1.getValue());
set.add(s1);
String s2 = swap(s1, p2.getKey(), p2.getValue());
set.add(s2);
String s3 = swap(str, p2.getKey(), p2.getValue());
set.add(s3);
String s4 = swap(s3, p1.getKey(), p1.getValue());
set.add(s4);
return set.last();
}
private static String swap(String str, int a, int b){
StringBuilder sb = new StringBuilder(str);
char temp1 = str.charAt(a);
char temp2 = str.charAt(b);
sb.setCharAt(a, temp2);
sb.setCharAt(b, temp1);
return sb.toString();
}
答案 2 :(得分:0)
这是我的Java解决方案:
String swapLexOrder(String str, int[][] pairs) {
Map<Integer, Set<Integer>> neighbours = new HashMap<>();
for (int[] pair : pairs) {
// It contains all the positions that are reachable from the index present in the pairs
Set<Integer> reachablePositionsL = neighbours.get(pair[0]);
Set<Integer> temp = neighbours.get(pair[1]); // We use it just to merge the two sets if present
if (reachablePositionsL == null) {
reachablePositionsL = (temp == null ? new TreeSet<>() : temp);
} else if (temp != null) {
// Changing the reference so every addition to "reachablePositionsL" will reflect on both positions
for (Integer index: temp) {
neighbours.put(index, reachablePositionsL);
}
reachablePositionsL.addAll(temp);
}
reachablePositionsL.add(pair[0]);
reachablePositionsL.add(pair[1]);
neighbours.put(pair[0], reachablePositionsL);
neighbours.put(pair[1], reachablePositionsL);
}
StringBuilder result = new StringBuilder(str);
for (Set<Integer> set : neighbours.values()) {
Iterator<Character> orderedCharacters = set.stream()
.map(i -> str.charAt(i - 1))
.sorted(Comparator.reverseOrder())
.iterator();
set.forEach(i -> result.setCharAt(i - 1, orderedCharacters.next()));
}
return result.toString();
}
Here一篇解释我的问题的文章。
答案 3 :(得分:-1)
String = "abcd"
co_ord = [(1,4),(3,4)]
def find_combinations(co_ord, String):
l1 = []
for tup_le in co_ord:
l1.extend(tup_le)
l1 = [x-1 for x in l1]
l1 = list(set(l1))
l2 = set(range(len(String)))-set(l1)
return l1,int(''.join(str(i) for i in l2))
def perm1(lst):
if len(lst) == 0:
return []
elif len(lst) == 1:
return [lst]
else:
l = []
for i in range(len(lst)):
x = lst[i]
xs = lst[:i] + lst[i+1:]
for p in perm1(xs):
l.append([x]+p)
return l
lx, ly = find_combinations(co_ord, String)
final = perm1(lx)
print(final)
temp = []
final_list=[]
for i in final:
for j in i:
temp.append(String[j])
final_list.append(''.join(temp))
temp=[]
final_list = [ i[:ly] + String[ly] + i[ly:] for i in final_list]
print(sorted(final_list,reverse=True)[0])