检查字符串是否为pangram的高效Java语言构造?
到目前为止,我已经想到了这个。我尝试最小化字符串操作,并将解决方案隔离到内置数据类型、数组和整数操作 我正在寻找一种更优雅的方法,用java检查pangram字符串 优雅,就像在最少的代码行中一样,其他高效的算法也很受欢迎 请提供没有lambda表达式的建议检查字符串是否为pangram的高效Java语言构造?,java,algorithm,performance,optimization,pangram,Java,Algorithm,Performance,Optimization,Pangram,到目前为止,我已经想到了这个。我尝试最小化字符串操作,并将解决方案隔离到内置数据类型、数组和整数操作 我正在寻找一种更优雅的方法,用java检查pangram字符串 优雅,就像在最少的代码行中一样,其他高效的算法也很受欢迎 请提供没有lambda表达式的建议 private static boolean isPangrams(String ip) { char[] characterArray = ip.toLowerCase().toCharArray();
private static boolean isPangrams(String ip) {
char[] characterArray = ip.toLowerCase().toCharArray();
int map[] = new int[26];
int sum = 0;
for(char current : characterArray) {
int asciiCode = (int) current;
if (asciiCode >= 97 && asciiCode <= 122) {
if (map[122 - asciiCode] == 0) {
sum += 1;
map[122 - asciiCode] = 1;
}
}
}
return sum == 26;
}
私有静态布尔isPangrams(字符串ip){
char[]characterArray=ip.toLowerCase().toCharray();
int map[]=新int[26];
整数和=0;
用于(当前字符:characterArray){
int ASCICODE=(int)电流;
如果(ascicode>=97&&ascicode,如果发现
map[122-ascicode]不等于零,因为从那时起它就不再是pangram了,而您可以将for()的其余部分保留下来-我说的对吗?
我知道这不是你期望的改进(特别是只有26个步骤),而是我想到的
if (map[122 - asciiCode] == 0) {
sum += 1;
map[122 - asciiCode] = 1;
} else return false;
最有效的解决方案O(n)时间复杂度:
迭代字符串并将每个字母放入HashMap
(键:字母,值:计数
)
反复浏览地图,检查字母表中的每个字母
如果你想要一个难以理解的几句话,回答:
private static boolean isPangrams(String ip) {
return 26== (new HashSet(Arrays.asList(ip.toUpperCase().replaceAll("[^A-Z]", "").toCharArray()))).size();
}
说明:
使字符串大写(将“a”和“a”处理为相同)
删除非A、B…Z的所有字符
将其转换为char[]
将数组转换为集合
将集合添加到集合
,以清除所有Doublette
测试集合的大小
您应该意识到,此代码不易阅读且不易执行。您可以使用按位操作:
private static boolean isPangrams(String ip) {
int flags = 0;
for(char current : ip.toLowerCase().toCharArray()) {
if (current >= 'a' && current <= 'z') {
flags |= 0x01<<(current-'a');
}
}
return flags == 0x3ffffff;
}
私有静态布尔isPangrams(字符串ip){
int标志=0;
for(当前字符:ip.toLowerCase().toCharArray()){
如果(current>='a'&¤t如果字符串包含int变量中的给定字母,则可以“打包”数据
static boolean pangram (String s) {
int check = 0;
String lowerCase = s.toLowerCase();
for (int i = 0; i < lowerCase.length(); i++) {
char ch = lowerCase.charAt(i);
if (ch >= 'a' && ch <= 'z') {
check |= (1 << s.charAt(i) - 'a');
}
}
return check == 67108863;
}
static boolean pangram(字符串s){
整数检查=0;
String lowerCase=s.toLowerCase();
for(int i=0;i 如果(ch>='a'&&ch那么,“改进”工作代码应该去codereview.stackexchange.com…无论如何:它不会变得更好,但是你可以使用位集而不是整数数组-当真/假是你真正需要的时候为什么要使用数字?!位集是一个整洁的输入。谢谢。我认为pangram的定义都是字符(a-z)至少有一次。你是对的,一个pangram必须至少包含每个字符一次。我想到了一个“完美pangram”,它只包含每个字母一次。Wikipedia/pangram:“一个完美pangram只包含字母表的每个字母一次,可以被认为是字母表的一个anagram”问题中的算法是O(n)太多了。所以复杂性不可能提高。是的,它在性能部分失败。但是,它满足我的要求。为什么要强制转换char
'current'并将其存储在int
'asciocode'中?您所做的所有操作都可以使用原始char
'current'而不是'asciocode'来完成。