public static Boolean cmprStr(String s1, String s2)
{
// STUFF
}
我想遍歷s1以確保s1中的每個字符都包含在s2中。如何迭代Java中的字符串?
public static Boolean cmprStr(String s1, String s2)
{
// STUFF
}
我想遍歷s1以確保s1中的每個字符都包含在s2中。如何迭代Java中的字符串?
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;
}
爲什麼不簡單使用'equals'方法?
Boolean b = s1.equals(s2);
length()
會給你一個字符串
charAt(someIndex)
會給你在給定位置的字符的長度,這樣你就可以遍歷的第一個字符串。
indexOf(achar)
將爲您提供一個字符串中的字符串,如果不存在則爲-1。因此您應該能夠在第二個字符串中查找第一個字符串中的每個字符。
+1提供必要的作品,而不是做他的功課。 – delnan 2011-05-30 16:50:07
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)解決方案(當正確實施時)更差。我想知道這種方法需要多長時間才能達到平衡。 – 2016-07-26 02:03:08
據我所知,這將是問題。
//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);
}
每String
也是Java中的一個CharSequence
。因此,您可以使用一個簡單的for循環容易遍歷一個String
:
int n = s.length();
for (int i = 0; i < n; ++i) {
char c = s.charAt(i);
...
}
其他所有的答案都爲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();
}
+1,用於減少O(n + m)的漸近複雜度。這對於很長的字符串很有用。只需構建一個HashSet,然後迭代第二個字符串的字符尋找集合成員資格,開銷會更少。而且,啓發式地講,散列較短的字符串然後迭代較長的字符串是有意義的。 – 2011-05-30 17:34:41
// 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
}
請添加一些解釋。 – 2016-08-21 16:07:12
不區分大小寫,或區分大小寫? – 2011-05-30 16:38:36
你的意思是每個人物都出現在兩者中,或者他們都是同一個字符串? – keyboardP 2011-05-30 16:39:11
s1中的每個字符出現在s2 – Shamoon 2011-05-30 16:41:54