编程题
编写一个函数,输入参数为三个:主字符串,子字符串,分隔符(例如:主字符串:1,bv,443s,9s9s 子字符串:9s9s 分隔符: ,)。要求在不用类似strstr(Java中的substring函数),strtok(Java中的StringToken类)等函数的前提下(遍历字符串来实现),实现判断子串在住串的存在性。
#include<iostream> using namespace std; /* 不使用内置函数: 两个指针,一个指向主字符串,另一个指向子字符串 分隔符另外考虑 ## 完全参考答案模板 */ bool subString(const char *sstr ,const char *substr,const char split){ const char *p1 = sstr; char split_flag = 0; const char *p2 = substr; if(!p1 || !p2 ||!p1[0] || !p2[0]){ return false; } while(p1[0] && p2[0]){ if((p1[0]==p2[0])&& (p2 != substr || !split_flag || split_flag == split)){ //当前字符匹配 且(子字符串还没检查完 || 还没有遇到间隔符 || 当前匹配的字符是间隔符<子字符串也由多个字符串组成的情况>) p2++; //继续检查匹配 }else{ p2 = substr; } if(!p2[0]){ //子字符串已经匹配完成了 if(!p1[1] || p1[1] == split) return true; else p2 = substr; } split_flag = p1[0]; p1++; } return false; } int main(){ cout<<subString("1,bv,443s,9s9s","9s9s",',')<<endl; system("pause"); return 0; }
static int f(String str,String substr,char spilt){ for (int i = 0,j=0; i < str.length(); i++) { if(j==substr.length()){ return i-1;//子串是空串返回-1,找到子串返回主串的下标 }else if(str.charAt(i)==spilt||str.charAt(i)!=substr.charAt(j)){ j=0; }else { j++; } } return -1;//返回-1, }
public class SolutionSubString { public static void main(String[] args) { System.out.println(subString("1,bv,443s,9s9s","9s9s",",")); } public static boolean subString(String str,String subString,String split) { if(isBlank(str)||isBlank(subString)||isBlank(split)) return false; String[] strs = str.split(split); for(String s : strs) { if(subString.equals(s)) return true; } return false; } public static boolean isBlank(String str) { if(str.isEmpty()||str.length()<=0||str==null) return true; return false; } }
bool List(const char * p1 , const char * p2 , const char c1) { //p3保留住p2的初始位置,方便复原p2的位置 const char *p3 = p2; while (*p1) { if(*p2 == '\0') { break; } else if(*p1 == c1 || *p2 != *p1) { //重置p2 p2 = p3; } else if(*p1 == *p2) { //移动p2 p2++; } //移动p1 p1++; } if (*p2 != '\0') { return false; } else { return true; } }
public static boolean isSubString(String FStr, String SStr,char f){ boolean flag=false; //遍历父串指针 int i=0; //遍历子串指针 int j=0; while (i< FStr.length()){ if(FStr.charAt(i)!=f&&SStr.charAt(j)==FStr.charAt(i)){ if (j==SStr.length()-1){//字串遍历完成 if (FStr.charAt(i+1)==f){//下一位是分隔符 flag=true; break; } break ;} i++; j++; }else{ i++; j=0; } } return flag; }
public boolean subString(String str, String subStr, String split) { if(isBlank(str) || isBlank(subStr) || isBlank(split)) { return false; } String[] strs = str.split(split); for(int i = 0; i < strs.length; i++) { if(subStr.equals(strs[i])) { return true; } } return false; } public boolean isBlank(String string) { if(string.length() == 0 || string == null) { return true; } return false; }
public Class Test{ public static boolean isExist(String str,String target){ if (str == null || target == null ||str.length() <= 0 || target.length() <= 0 ) return false; if(target.length() > str.length()) return false;//子串比源串长,直接返回 int tIndex = 0;//子串索引位置 int count = 0;//匹配子串的字符个数 for(int i = 0 ; i < str.length(); i++){//遍历字符串 System.out.println(i); int temp = i;//保存字符串遍历位置 while (tIndex < target.length()) { boolean flag = (target.charAt(tIndex++)) == (str.charAt(i));//匹配标志 if (flag) i++;//匹配子串成功,继续匹配下一个字符 else i = temp;//匹配子串失败,恢复遍历位置 System.out.println("flag = " + flag); if (flag) count ++;//统计匹配子串字符的个数 } if(count == target.length()){//如果匹配统计等于子串长度,说明匹配成功,返回,不再后续匹配 return true; } tIndex = 0;//恢复子串索引位置 count = 0;//恢复统计个数 } return false; } public static boolean isExist(String str,String target,String symbol){ if (str == null) return false; String[] group = null; if (str.contains(",")){ group = str.split(",");//分组 } if (group == null) return isExist(str,target); else { boolean flag;//匹配成功标志 for (String s : group) { System.out.println("group =" + s);//每组源串 flag = isExist(s, target); if (flag) return true;//匹配成功,返回 } return false; } } public static void main(String[] args) { System.out.println("测试匹配结果:" + isExist("abc,dec,fg", "de", ",")); System.out.println("测试不匹配结果:" + isExist("abc,dec,fg", "def", ",")); } }
public static boolean panduan(String str1, String str2, char c){ int index = 0; boolean n1 = true; for(int i = 0; i < str2.length(); i++){ if(str1.charAt(i) != str2.charAt(i)){ n1 = false; } } if(n1 && str1.charAt(str2.length()) == c){ return true; } boolean n2 =true; int num = str2.length() - 1; for(int i = str1.length() - 1; i >= str1.length() - str2.length(); i--){ if(str1.charAt(i) != str2.charAt(num)){ n2 = false; } num--; } if(n2 && str1.charAt(str1.length() - str2.length() - 1) == c){ return true; } for(int i = 0; i < str1.length(); i++){ if(str1.charAt(i) == str2.charAt(index)){ index++; if(index == str2.length() ){ if(str1.charAt(i + 1) == c && str1.charAt(i - str2.length()) == c){ return true; } } } else{ index = 0; } } return false; }
private static boolean isStringExsits(String mainStr,String subStr,char spl) { char [] ch =mainStr.toCharArray(); List <String> list = new ArrayList<>(); String newStr=""; for (int i = 0; i < ch.length; i++) { if (ch[i]!=spl){ newStr += ch[i]; }else { list.add(newStr); newStr =""; } if (i==ch.length-1){ list.add(newStr); newStr =""; } } for (String str : list) { if (str.equals(subStr)){ return true; } } return false; }