首页 > 试题广场 >

字符串切分

[编程题]字符串切分
  • 热度指数:1021 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
从标准输入读取字符串,按照指定的两层分隔符切分成多对key-value,依次输出到标准输出中。
注意:仅输出key和value都为非空串的pair。

输入描述:
每一行有效输入为三列,列之间以' '分隔,第一列表示key_value_pairs_delimiter,第二列表示key_value_delimiter,第三列表示待切分的字符串。分隔符' '不会出现在列内容中。

输入样例:

# : a:3#b:8#c:9


输出描述:
先输出有效key-value对的个数(单独一行);再依次输出key-value对,每一对单独成行,以' ‘分隔key和value。

输出样例:

3
a 3
b 8
c 9
示例1

输入

# : a:3#b:8#c:9

输出

3
a 3
b 8
c 9
import java.util.ArrayList;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] strings = sc.nextLine().split(" ");  // # : a:3#b:8#c:9
        // 注意对输入做校验
        if (strings.length < 3) {
            System.out.println(0);
        } else {
            String a = strings[0], b = strings[1];
            String[] splitString = strings[2].split(a);
            ArrayList<String> res = new ArrayList<>();
            for (String s : splitString) {
                if (s.contains(b)) {
                    res.add(s);
                }
            }
            if (!res.isEmpty()) {
                System.out.println(res.size());
                for (String re : res) {
                    System.out.println(re.replace(b, " "));
                }
            } else System.out.println(0);
        }
    }
}
注意对输入数据做校验,要不然提示数组可能越界,通过率一直卡在 80%
发表于 2020-08-13 15:53:44 回复(1)
1. 先获取间隔符和关系符
2. 用split(间隔符)得到分离后的字符串数组
3. 用contains(关系符)检验各个字符串是否标准
4. 用replace(关系符, 空格)输出
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        String str = input.nextLine();
        if(str.length()<4){
            System.out.println(0);
        } else {
        char sc = str.charAt(0);
        char xc = str.charAt(2);//1. 先获取间隔符和关系符
        String[] ans = str.substring(4).split(sc+"");//2. 用split(间隔符)得到分离后的字符串数组
        int ansnum = ans.length;
        for(String s : ans){
            if(!s.contains(xc+"")) ansnum--;
        }
        System.out.println(ansnum);
        if(ansnum>0){
            for(String s : ans){
                if(s.contains(xc+"")){//3. 用contains(关系符)检验各个字符串是否标准
                    System.out.println(s.replace(xc,' '));//4. 用replace(关系符, 空格)输出
                }
            }
        }
    }}
}


发表于 2020-07-22 13:09:01 回复(0)
请教一下我这个代码,5个例子只能通过两个,实在不知道哪有问题了
#include<iostream>
#include<string>
#include<vector>
#include<sstream>
#include<istream>
using namespace std;
int main() {
    char a, b; string c,p;
    cin >> a >> b;
    getline(cin, c);
    vector<string>s, q;
    stringstream ss(c);
    while (getline(ss, c, a)) //第一次分割
        s.push_back(c);
    cout << s.size() << endl;
    for (int i = 0; i < s.size(); i++) {
        stringstream tmp(s[i]);
        while (getline(tmp, c, b)) //第二次分割
            q.push_back(c);
        for (int i = 0; i < q.size(); i++) { //把空格去掉
           stringstream tmpq(q[i]);
           while (getline(tmpq, c, ' '))
               p += c;
           if (i != q.size())
               cout << p << ' ';
           else
               cout << p;
           p = "";     
        }
        q.clear();
        cout << endl;
    }
    s.clear();

}

发表于 2021-09-11 20:25:41 回复(1)
这种题目不多给几个示例,真的难知道哪出问题了。。。。
发表于 2022-08-22 17:58:59 回复(0)
using System;
using System.Collections.Generic;
namespace leetcode_sharp
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> keylist = new List<string>();
            List<string> valuelist = new List<string>();
            string line = Console.ReadLine();
            var spl = line.Split(" ");
            if(spl.Length!=3)
            {
                Console.WriteLine("0");
                return;
            }    
            var pair_sp = spl[0];
            var kv_sp = spl[1];
            var kvs = spl[2].Split(pair_sp);
            foreach (var item in kvs)
            {
                string[] t = item.Split(kv_sp);
                if (t.Length > 1)
                {
                    keylist.Add(t[0]);
                    valuelist.Add(t[1]);
                }
                
            }
            Console.WriteLine(keylist.Count);
            for(int i = 0; i < keylist.Count; i++)
            {
                Console.WriteLine("{0} {1}",keylist[i],valuelist[i]);
            }
        }
    }
}

暴力
发表于 2021-03-06 00:34:06 回复(0)
借鉴了评论区大佬的想法,C++做这种题真不容易啊。
#include<bits/stdc++.h>
using namespace std;
typedef pair<string,string> PII;
int main()
{
    string str;
    while(getline(cin,str))
    {
        if(str.size()<=3)
        {
            cout<<0<<endl;
            continue;
        }
        string c1,c2;
        int p1=str.find(' ',0);
        c1=str.substr(0,p1);            //分割键值对
        int p2=str.find(' ',p1+1);
        c2=str.substr(p1+1,p2-p1-1);    //分割k和v
        
        vector<string> key_val;
        int st=p2+1;
        while(st<str.size())
        {
            int pos=str.find(c1,st);
            if(string::npos==pos)
            {
                key_val.push_back(str.substr(st,str.size()-st));
                st=str.size(); 
            }
            else{
                key_val.push_back(str.substr(st,pos-st));
                st=pos+c1.size();
            }
        }
        vector<PII> ans;
        for(auto &s:key_val)
        {
            int pos=s.find(c2,0);
            if(pos==string::npos)    continue;
            ans.push_back({s.substr(0,pos),s.substr(c2.size()+pos)});
        }
        cout<<ans.size()<<endl;
        for(auto &p:ans)
            cout<<p.first<<" "<<p.second<<endl;
    }
    return 0;
}


发表于 2020-09-03 15:36:02 回复(0)
#include <iostream>
#include <cstring>
#include <vector>
#include <string>
using namespace std;
int main()
{
	vector<pair<string, string>> res;
	char *p, *p1, *p2;
	char a, b, str[1000] = { 0 };
	cin >> a >> b >> str;
	p1 = str;
	while (p = strchr(p1, b))
	{
		char tmp1[100] = { 0 }, tmp2[100] = { 0 };
		p2 = p;
		while (*p2 != a && p2 != str)
		{
			p2--;
		}
		if (p2 != str) p2++;
		strncpy(tmp1, p2, p - p2);
		p2 = p;
		while (*p2 != a && *p2 != '\0')
		{
			p2++;
		}
		strncpy(tmp2, p + 1, p2 - p - 1);
		res.push_back(make_pair(string(tmp1), string(tmp2)));
		p1 = p + 1;
	}
	cout << res.size() << endl;
	for (auto elem : res)
	{
		cout << elem.first << ' ' << elem.second << endl;
	}
	return 0;
}

发表于 2020-08-13 16:18:25 回复(0)
public void my(){
        Scanner scanner = new Scanner(System.in);
        String str = scanner.nextLine();
        String[] chars = str.split(" ");
        //#
        String pairs_delimiter = chars[0];
        //:
        char k_v_delimiter = chars[1].charAt(0);
        //a:3#b:8#c:9
        String kv= chars[2];
        String[] target = kv.split(pairs_delimiter);
        System.out.println(target.length);
        for(int i = 0;i < target.length;i++){
            String s = target[i].replace(k_v_delimiter, ' ');
            System.out.println(s);
        }

    }

哥哥们为啥本地过了,牛客没过图片说明

发表于 2020-07-25 20:57:35 回复(2)
importjava.util.*;
publicclassMain{
    publicstaticvoidmain(String[] args){
        Scanner sc = newScanner(System.in);
        String s = sc.nextLine();
        intN = s.length();
        if(N < 5){
            System.out.println(0);
            return;
        }
        String[] ss = s.split(" ");
        String key_value_pairs_delimiter = ss[0];
        String key_value_delimiter = ss[1];
        String[] keyValues = ss[2].split(key_value_pairs_delimiter);
        intsize = 0;
        String[] res = newString[keyValues.length];
        for(inti = 0; i < keyValues.length; i++){
            String[] keyValue = keyValues[i].split(key_value_delimiter);
            if(keyValue.length == 2){
                res[size] = keyValue[0] + " "+ keyValue[1];
                size++;
            }
        }
        System.out.println(size);
        for(inti = 0; i < size; i++){
            System.out.println(res[i]);
        }
         
         
         
    }
}

编辑于 2020-07-21 20:29:18 回复(0)
import java.util.Scanner;
import java.util.Map;
import java.util.HashMap;

public class Main {


    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        // # : a:5#bb:7#w:4
        String input = s.nextLine();
        String[] src = input.split(" ");
    
        if(src.length < 3){
            System.out.println(0);
            return;
        }
        
        // 分隔符
        String deco1 = src[0];
        String deco2 = src[1];
        String in = src[2];

        String[] str = in.split(deco1);

        int count = 0;
        Map<String, String> result = new HashMap<String, String>();


        for (int i = 0; i < str.length; i++) {
            String[] temp = str[i].split(deco2);
            if(temp.length<2){
                continue;
            }
            if (!"".equals(temp[0]) && !"".equals(temp[1])) {
                count++;
                result.put(temp[0], temp[1]);
            }
        }

        System.out.println(count);
        for (String key : result.keySet()) {
            System.out.println(key + " " + result.get(key));
        }
    }


}

发表于 2020-07-15 17:18:35 回复(0)
C++
#include <iostream>
(720)#include <sstream>
#include <string>
(765)#include <vector>
 
using namespace std;
 
int main()
{
    char pair_delim, kv_delim;
    string str;
    cin >> pair_delim >> kv_delim >> str;
    stringstream ss(str);
    string pair;
    vector<string> res;
    unsigned cnt = 0;
    while (getline(ss, pair, pair_delim)) {
        string k_or_v, k_and_v;
        if (pair.find(kv_delim) == pair.npos)
            continue;
        stringstream ss2(pair);
        while (getline(ss2, k_or_v, kv_delim)) {
            k_and_v += k_or_v + " ";
        }
        res.push_back(k_and_v);
        ++cnt;
        k_and_v.clear();
    }
    cout << cnt << endl;
    for (const string &s : res)
        cout << s << endl;
    return 0;
}


发表于 2020-03-09 14:54:17 回复(0)