public static Boolean cmprStr( String s1, String s2 )
{
// STUFF
}
我希望能够遍历s1,以确保s1中的每个字符都包含在s2中。
for(char c: s1.toCharArray()){
if(s2.indexOf(c) == -1){
return false;
}
}
return true;
假设
s1 = "aabb";
s2 = "ccddaannbbss";
将返回 true。
public static Boolean cmprStr( String s1, String s2 )
{
for (int i = s1.length() - 1; i >= 0; --i) {
if (s2.indexOf(s1.charAt(i)) == -1) {
return Boolean.FALSE;
}
}
return Boolean.TRUE;
}
length()
将会给你一个字符串的长度
charAt( someIndex)
这将给你指定位置上的字符,因此你可以遍历第一个字符串。
indexOf( achar )
将返回所查找字符在字符串中的位置,如果不存在则返回-1。因此,您应该能够在第二个字符串中查找第一个字符串中的每个字符。
其他所有答案的时间复杂度都是O(n^2)。这里有一种使用Google Guava的方法,时间复杂度为线性(即O(n)):
public static boolean cmprStr(String s1, String s2) {
Set<Character> desiredCharacters = Sets.newHashSet(Lists.charactersOf(s2));
return Sets.difference(Sets.newHashSet(Lists.charactersOf(s1)), desiredCharacters).isEmpty();
}
Set<Character> charsInS1 = new HashSet<Character>();
for (int i = 0; i < s1.length(); i++) {
charsInS1.add(s1.charAt(i));
}
for (int i = 0; i < s2.length(); i++) {
charsInS1.remove(s2.charAt(i));
}
return charsInS1.isEmpty();
O(n+m)
... 使用 indexOf
来得出答案的复杂度为 O(n*m)
。当然,这会暂时使用一些额外的内存。HashSet
时还有相当多的额外处理开销。我敢打赌,对于非常短的字符串,这比O(n*m)解决方案(正确实现时)表现更差。我想知道这种方法需要多长的字符串才能达到平衡点。 - Ted HoppBoolean b = s1.equals(s2);
s1.compareTo(s2)
会给你负数、零、正数的值。零表示相等。阅读http://j.mp/mONeBc。 - ahmet alp balkans1
中的每个字符是否也在s2
中出现。按照问题描述,它不应考虑字符出现的顺序或次数,但这段代码两者都考虑了。 - ColinD根据我的理解,问题应该是这样的。
//for each character in s1
//if s2 does not contain character return false
//return true
for(int i = 0; i < length s1; i++){
if(!s2.contains(String.valueOf(s1.charAt(i)))){
return false;
}
}
return true;
这个函数验证了s1中的每个字符都在s2中出现过。它不关心顺序,也不关心数量,因此不是一个等值方法。
递归:
public static Boolean cmprStr( String s1, String s2 )
{
if(s1.length() == 0 )
{
return true;
}
if(!s2.contains(s1.substring(0,1)))
{
return false;
}
return cmprStr(s1.substring(1), s2);
}
在Java中,每个String
也是一个CharSequence
。因此,您可以使用简单的for循环轻松迭代String
:
int n = s.length();
for (int i = 0; i < n; ++i) {
char c = s.charAt(i);
...
}
// Here's some code I wrote to find CG ratio in a gene
public double findCgRatio(String gene)
{
double cCount =0.0;
double gCount =0.0;
gene = gene.toLowerCase();
for(char character : gene.toCharArray())
{
if(character == 'c')
{
cCount++;
}
else if(character == 'g')
{
gCount++;
}
}
System.out.println("CG Ratio was :" + (cCount/gCount) );
return cCount/gCount; // cgRatio
}