描述
给你一个字符串数组 ideas 表示在公司命名过程中使用的名字列表。公司命名流程如下:
从 ideas 中选择 2 个 不同 名字,称为 ideaA 和 ideaB 。
交换 ideaA 和 ideaB 的首字母。
如果得到的两个新名字 都 不在 ideas 中,那么 ideaA ideaB(串联 ideaA 和 ideaB ,中间用一个空格分隔)是一个有效的公司名字。
否则,不是一个有效的名字。
返回 不同 且有效的公司名字的数目。
分析
暴力遍历每一对字符串O(n^2)会超时.
替换字符串得首字母,判断在ideas中是否已经出现。
建立一个首字母对首字母的26*26大小二维数组。
单边计算把字符串得首字母替换成任意一个字母,然后再到ideas中判断时候已经出现过,没有出现则这个新字符串是有效得,有效记录加一。所有得字符串都做这样处理。
遍历二维数组,ch[i][j] * ch[j][i],如果一个字符串的首字母替换之后在Ideas中不存在,替换首字母的字符在ideas的字符串中不存在,则ch[i][j] * ch[j][i]的结果是0,因此不会凭空多出结果。
class Solution {
public long distinctNames(String[] ideas) {
Set<String> set = new HashSet<>();
for (String str : ideas) {
set.add(str);
}
int[][] ch = new int[26][26];
for (String str : ideas) {
int index = str.charAt(0) - 'a';
for (int i = 0; i < 26; i++) {
String s = (char)('a'+i) + str.substring(1);
if (!set.contains(s)) {
ch[index][i]++;
}
}
}
long ans = 0;
for (int i = 0; i < 26; i++) {
for (int j = 0; j < 26; j++) {
ans += ch[i][j] * ch[j][i];
}
}
return ans;
}
}