我正在尝试在不使用内置String method contains()
方法的情况下实施contains()
。
这是我到目前为止所做的:
public static boolean containsCS(String str, CharSequence cs) {
char[] chs = str.toCharArray();
int i=0,j=chs.length-1,k=0,l=cs.length();
//String str = "Hello Java";
// 0123456789
//CharSequence cs = "llo";
while(i<j) {
if(str.charAt(i)!=cs.charAt(k)) {
i++;
}
if(str.charAt(i)==cs.charAt(k)) {
}
}
return false;
}
我只是练习我的算法技能并陷入困境。
有什么建议吗?
答案 0 :(得分:8)
仅使用1个循环
我对Poran的答案做了一些补充,它完全正常:
public static boolean contains(String main, String Substring) {
boolean flag=false;
if(main==null && main.trim().equals("")) {
return flag;
}
if(Substring==null) {
return flag;
}
char fullstring[]=main.toCharArray();
char sub[]=Substring.toCharArray();
int counter=0;
if(sub.length==0) {
flag=true;
return flag;
}
for(int i=0;i<fullstring.length;i++) {
if(fullstring[i]==sub[counter]) {
counter++;
} else {
counter=0;
}
if(counter==sub.length) {
flag=true;
return flag;
}
}
return flag;
}
答案 1 :(得分:2)
正如JB Nizet建议的那样,here是contains()
的实际代码:
2123 public boolean contains(CharSequence s) {
2124 return indexOf(s.toString()) > -1;
2125 }
以下是indexOf()
的代码:
1732 public int indexOf(String str) {
1733 return indexOf(str, 0);
1734 }
导致:
1752 public int indexOf(String str, int fromIndex) {
1753 return indexOf(value, offset, count,
1754 str.value, str.offset, str.count, fromIndex);
1755 }
最终导致:
1770 static int indexOf(char[] source, int sourceOffset, int sourceCount,
1771 char[] target, int targetOffset, int targetCount,
1772 int fromIndex) {
1773 if (fromIndex >= sourceCount) {
1774 return (targetCount == 0 ? sourceCount : -1);
1775 }
1776 if (fromIndex < 0) {
1777 fromIndex = 0;
1778 }
1779 if (targetCount == 0) {
1780 return fromIndex;
1781 }
1782
1783 char first = target[targetOffset];
1784 int max = sourceOffset + (sourceCount - targetCount);
1785
1786 for (int i = sourceOffset + fromIndex; i <= max; i++) {
1787 /* Look for first character. */
1788 if (source[i] != first) {
1789 while (++i <= max && source[i] != first);
1790 }
1791
1792 /* Found first character, now look at the rest of v2 */
1793 if (i <= max) {
1794 int j = i + 1;
1795 int end = j + targetCount - 1;
1796 for (int k = targetOffset + 1; j < end && source[j] ==
1797 target[k]; j++, k++);
1798
1799 if (j == end) {
1800 /* Found whole string. */
1801 return i - sourceOffset;
1802 }
1803 }
1804 }
1805 return -1;
1806 }
答案 2 :(得分:2)
提示:
String.indexOf
的代码,它只是进行简单的搜索...)答案 3 :(得分:2)
这应该可以正常工作。我正在打印执行以帮助理解这个过程。
testing221
答案 4 :(得分:1)
我想出了这个:
public static boolean isSubString(String s1, String s2) {
if (s1.length() > s2.length())
return false;
int count = 0;
//Loop until count matches needle length (indicating match) or until we exhaust haystack
for (int j = 0; j < s2.length() && count < s1.length(); ++j) {
if (s1.charAt(count) == s2.charAt(j)) {
++count;
}
else {
//Redo iteration to handle adjacent duplicate char case
if (count > 0)
--j;
//Reset counter
count = 0;
}
}
return (count == s1.length());
}
答案 5 :(得分:0)
我最近偶然发现了这个问题,尽管我会分享一个替代解决方案。我会生成所有子字符串,其长度与我们要查找的字符串的长度相同,然后将其推入哈希集,并检查其中是否包含该子集。
static boolean contains(String a, String b) {
if(a.equalsIgnoreCase(b)) {
return true;
}
Set<String> allSubStrings = new HashSet<>();
int length = b.length();
for(int i=0; i<a.length(); ++i) {
if(i+length <= a.length()) {
String sub = a.substring(i, i + length);
allSubStrings.add(sub);
}
}
return allSubStrings.contains(b);
}
答案 6 :(得分:0)
public static boolean contains(String large, String small) {
char[] largeArr = large.toCharArray();
char[] smallArr = small.toCharArray();
if (smallArr.length > largeArr.length)
return false;
for(int i = 0 ; i <= largeArr.length - smallArr.length ; i++) {
boolean result = true ;
for(int j = 0 ; j < smallArr.length ; j++) {
if(largeArr[i+j] != smallArr[j]) {
result = false;
break;
}
result = result && (largeArr[i+j]==smallArr[j]);
}
if(result==true) {return true;}
}
return false;
}
答案 7 :(得分:0)
由于嵌套循环,肯定不是最有效的解决方案,但它似乎工作得很好。
import React, { useState } from "react";
import "./styles.css";
const style = {
display: "flex",
justifyContent: "center",
alignItems: "center",
flexWrap: "wrap"
};
const initialData = {
"name1": 12,
"name2": 20,
"name3": 30,
"name4": 40,
"name5": 5
};
export default function App() {
const [data, setData] = useState(initialData);
const onChange = e => {
setData({...data, [e.target.name]: e.target.value });
};
const onClick = e => {
e.preventDefault();
console.log("data ", data);
};
return (
<div className="App" style={style}>
{Object.keys(data).map((key, index) => {
return (
<div key={index} style={{ display: "flex", flexDirection: "column" }}>
<input
type="text"
style={{ marginTop: "100px" }}
value={data[key]}
name={key}
onChange={onChange}
/>
</div>
);
})}
<button onClick={onClick}>Submit</button>
</div>
);
}
答案 8 :(得分:-1)
可以使用单个循环完成。
public boolean StringContains(String full, String part) {
long st = System.currentTimeMillis();
if(full == null || full.trim().equals("")){
return false;
}
if(part == null ){
return false;
}
char[] fullChars = full.toCharArray();
char[] partChars = part.toCharArray();
int fs = fullChars.length;
int ps = partChars.length;
int psi = 0;
if(ps == 0) return true;
for(int i=0; i< fs-1; i++){
if(fullChars[i] == partChars[psi]){
psi++; //Once you encounter the first match, start increasing the counter
}
if(psi == ps) return true;
}
long et = System.currentTimeMillis()- st;
System.out.println("StringContains time taken =" + et);
return false;
}