首页 > 试题广场 >

确定字符互异

[编程题]确定字符互异
  • 热度指数:95565 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

给定一个字符串string iniString,请返回一个bool值,True代表字符串的所有字符全都不同,False代表存在相同的字符。保证字符串中的字符为ASCII字符且不允许使用额外的存储结构,字符串的长度小于等于3000。大小写字母算不同的字符

测试样例:
"aeiou"
返回:True
"BarackObama"
返回:False
推荐
public boolean checkDifferent(String iniString) {   
return !iniString.matches(".*(.)(.*\\1).*");
}

编辑于 2016-02-24 11:33:12 回复(87)
import java.util.*;

public class Different {
    public boolean checkDifferent(String iniString) {
        int iniLength = iniString.length();
        char[] charArray = iniString.toCharArray();
        TreeSet<Character> after = new TreeSet<Character>();
        for(int i = 0;i<charArray.length;i++){
        	after.add(charArray[i]);
        }
        int afterLength = after.size();
        if(afterLength==iniLength)
        	return true;
        return false;
    }
}

发表于 2016-07-19 22:16:57 回复(8)
# -*- coding:utf-8 -*-
class Different:
    def checkDifferent(self, iniString):
        # write code here
        if len(iniString) == len(set(iniString)):
            return True
        else:
            return False
python就这样写就可以了额,set会去重,如果有重复的长度就不一样了,否则,就是没重复的哈
发表于 2016-12-01 21:21:10 回复(3)
class Different {
public:
    bool checkDifferent(string iniString) 
    {
        bool flag[128] = {false};
   for (auto it = iniString.cbegin(); it != iniString.cend(); ++it)
        {
            if (!flag[*it])
                flag[*it] = true;
            else
                return false;
        }
        return true;
    }
};
发表于 2015-09-07 10:38:46 回复(0)
不定义任何存储结构,只需要两个循环变量:
class Different {
public:
    bool checkDifferent(string iniString) {
        // write code here
        for(size_t i = 0; i < iniString.size(); i++)
        {
            for(size_t j = 0; j < iniString.size(); j++)
            {
                if((iniString[i] == iniString[j]) && (i != j))
                    return false;
            }
        }
        return true;
    }
};


发表于 2019-10-23 17:31:06 回复(0)
跟一楼的大佬比我就是个渣渣啊。。。
import java.util.*;
public class Different {
    public boolean checkDifferent(String iniString) {
        char[] string = iniString.toCharArray();
        for(int i = 0; i < string.length; i++){
            int tmp = string[i];
            for(int j = i + 1; j < string.length; j++)
                if( tmp == string[j])
                    return false;
        }
        return true;
    }
}
发表于 2018-03-20 17:51:38 回复(1)
//这道题理解起来并不是很难
public static boolean checkDifferent(String iniString) {
            //先将字符串转换成字符数组
		char[] str = iniString.toCharArray();
            //定义跳出二层循环条件
		boolean find = false;
		for (int i = 0; i < str.length && !find; i++) {
			for (int j = i+1; j < str.length; j++) {
                                //当发现相同字符时,修改条件,直接跳出二层循环
				if (str[i] == str[j]) {
					find = true;
					break;
				}
			}
		}
                //返回查找结果
		return !find;
	}

编辑于 2018-02-13 23:37:50 回复(1)
    先用sort()函数排序,对于字符串如sort(str.begin(),str.end());然后遍历字符串,相邻直接进行比较。
class Different {
public:
    bool checkDifferent(string iniString) {
        // write code here       
        sort(iniString.begin(),iniString.end());
        for(int i=0;i<iniString.size();i++)
          {         
              if(iniString[i]==iniString[i-1])
              return false;
          }
        return true;
    }
};

发表于 2017-04-28 20:29:21 回复(0)
import java.util.*;

public class Different {
    public boolean checkDifferent(String iniString) {
        
        for (int i=0; i<iniString.length(); i++)
            for (int j=i+1; j<iniString.length(); j++){
            if (iniString.charAt(i) == iniString.charAt(j))
                return false;
        }
        
        return true;
        // write code here
    }
}

发表于 2016-12-30 10:52:48 回复(0)
importjava.util.*;
 
publicclassDifferent {
    public boolean checkDifferent(String iniString) {
        int[] flag =new int[1000];
        for(inti=0;i<iniString.length();i++){
            charc = iniString.charAt(i);
            if(flag[c]>0)return false;
            else flag[c] =1;
        }
        return true;
    }
}


发表于 2015-07-12 12:02:04 回复(7)
    bool checkDifferent(string iniString) {
        // write code here
        char f = iniString[0];
        for(int i = 1; i < iniString.length(); i++) 
            if(f == iniString[i]) return false;
        return true;
    }
这样的也能过?测试用例是不是太弱了。。。
发表于 2015-12-02 22:23:32 回复(5)
python思路:
1. 对字符串中的每一个字母计数,出现大于1就返回False。
2. set()去重,比较长度是否变化。
3. 依次取字母,看该字母是否在切片后(切掉包括该字母之前的所有字母)的字符串中
发表于 2017-06-05 11:14:03 回复(1)
import java.util.*;
public class Different {
    public boolean checkDifferent(String iniString) {
        // write code here
        if(iniString.length() > 256) return false;
        
        boolean[] char_set = new boolean[65535];
        for(int i = 0; i < iniString.length(); i++){
            int val = iniString.charAt(i);
            if(char_set[val])
                return false;
            char_set[val] = true;
        }
        return true;
    }
}

发表于 2016-09-25 10:15:41 回复(0)
import java.util.*;

public class Different {
    public boolean checkDifferent(String iniString) {
        // write code here
        HashSet<Character> hashset=new HashSet<>();
        for(int i=0;i<iniString.length();i++){
            if(hashset.contains(iniString.charAt(i))){
                return false;
            }else{
                hashset.add(iniString.charAt(i));
            }
        }
        return true;
    }
}

发表于 2022-07-13 20:53:47 回复(0)
return len(iniString) == len(set(iniString))

发表于 2022-05-06 16:07:05 回复(0)
这道题很奇怪,使用栈空间创建数组无法通过,使用堆空间就可以过,不知道啥原因。
下面可以:
class Different
{
public:
	bool checkDifferent(string iniString)
	{
		if (iniString.length() > 256) return false;
        int length = 256;
		int *result = (int *)malloc(length*sizeof(int));
        memset(result, 0, length*sizeof(int));
		for (int i = 0; i < iniString.length(); i++)
		{
			int index = iniString[i];
            if(result[index] == 1) return false;
			result[index]++;

		}// write code here
		return true;
	}
};
下面不行:
class Different
{
public:
	bool checkDifferent(string iniString)
	{
		if (iniString.length() > 256) return false;

		int result[256] = { 0 };
		for (int i = 0; i < iniString.length(); i++)
		{
			int index = iniString[i];
			result[index]++;
			if (result[index] > 1) return false;

		}// write code here
		return true;
	}
};
报错为:
运行错误:请检查是否存在数组、列表等越界非法访问,内存非法访问等情况
case通过率为0.00%
*** Error in `./a.out': free(): invalid pointer: 0x00007fff9b988e39 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7f734f3c57e5]
/lib/x86_64-linux-gnu/libc.so.6(+0x8037a)[0x7f734f3ce37a]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7f734f3d253c]
./a.out[0x40b46c]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7f734f36e830]
./a.out[0x401a99]
======= Memory map: ========



发表于 2020-12-23 22:13:42 回复(0)
'''思路:可以利用python里边的set()去重功能,如果set(字符串)的长度与原字符串长度一样,说明没有重复的元素,返回True,否则返回Flase.
# -*- coding:utf-8 -*-
class Different:
    def checkDifferent(self, iniString):
        # write code here
        if len(set(iniString))==len(iniString):
            return True
        else:
            return False
发表于 2020-10-06 22:24:14 回复(0)
其实一行代码就行,也不用什么复杂的正则
class Different:
    def checkDifferent(self, iniString):
        # write code here
        return len(set(iniString)) == len(iniString)

发表于 2020-03-17 22:32:46 回复(0)
class Different {
public:
    bool checkDifferent(string iniString) {
        sort(iniString.begin(),iniString.end());
        int num=0,i=0;
        num=iniString.size();
        for ( i = 1; i < num; i++)
        {
            if (iniString[i] == iniString[i-1])
            {
                 return false;
            }
        }
        return true;
    }
};
我的做法是先进行排序然后在查找是否前后有相同的字符
发表于 2020-01-31 17:33:57 回复(0)
import java.util.*;

public class Different {
    public boolean checkDifferent(String iniString) {
        // write code here
        List<Character> charList = new ArrayList<Character>();
        for (int i = 0; i < iniString.length(); i++) {

            char c = iniString.charAt(i);
            if (charList.contains(c)) {
                return false;
            }
            
            charList.add(c);
            
        }
        return true;
    }
}



个人认为是面向对象编程而言最好的答案

发表于 2019-09-02 14:59:24 回复(0)
public class Different {
    public boolean checkDifferent(String iniString) {
        boolean[] arr = new boolean[65536]; // 不用额外空间就是空间复杂度O(1)
        int len = iniString.length();
        for (int i = 0; i < len; ++i) {
            char c = iniString.charAt(i);
            if (arr[c])    return false;
            arr[c] = true;
        }
        return true;
    }
}

题目有问题,保证是ASCII字符只需要new boolean[256],但是会越界,必须new boolean[65536]才行,说明是Unicode字符,不知道牛客后续会不会改题目或者测试用例。

发表于 2018-12-17 12:16:13 回复(0)